Моя цель - проанализировать большие файлы csv с помощью С++ в проекте QT в среде OSX. (Когда я говорю csv, я имею в виду tsv и другие варианты 1GB ~ 5GB).
Это похоже на простую задачу, но все усложняется, когда размер файлов становится больше. Я не хочу писать свой собственный синтаксический анализатор из-за множества краевых случаев, связанных с разбором файлов csv.
Я нашел различные библиотеки обработки csv для обработки этого задания, но разбор 1GB файла занимает около 90-120 секунд на моей машине, что неприемлемо. я ничего не делаю с данными прямо сейчас, я просто обрабатываю и отбрасываю данные для целей тестирования.
cccsvparser - одна из библиотек, которые я пробовал. Но единственной достаточно быстрой библиотекой была fast-cpp-csv-parser, которая дает приемлемые результаты: 15 секунд на моей машине, но она работает только тогда, когда структура файла Известно.
Пример использования: fast-cpp-csv-parser
#include "csv.h"
int main(){
io::CSVReader<3> in("ram.csv");
in.read_header(io::ignore_extra_column, "vendor", "size", "speed");
std::string vendor; int size; double speed;
while(in.read_row(vendor, size, speed)){
// do stuff with the data
}
}
Как вы можете видеть, я не могу загрузить произвольные файлы, и я должен определенно определять переменные в соответствии с моей файловой структурой. Я не знаю ни одного метода, который позволяет мне динамически создавать эти переменные во время выполнения.
Другой подход, который я пробовал, - это прочитать файл csv по строке fast-cpp-csv-parser класс LineReader, который очень быстро (около 7 secs, чтобы прочитать весь файл), а затем проанализировать каждую строку с помощью cccsvparser lib, которая может обрабатывать строки. но это занимает около 40 секунд до завершения, это улучшение по сравнению с первыми попытками, но все же неприемлемо.
Я видел различные вопросы stackoverflow, связанные с разбором файлов csv, ни один из них не требует большой обработки файлов для учетной записи.
Также я потратил много времени на поиски решения этой проблемы, и я действительно скучаю по свободе, которую менеджеры пакетов предпочитают npm или pip при поиске из готовых решений.
Я буду благодарен за любое предложение о том, как справиться с этой проблемой.
Edit:
При использовании подхода @fbucek время обработки сокращается до 25 секунд, что является большим улучшением.
можем ли мы оптимизировать это еще больше?