Так что концептуально я читаю файл с ~ 2 миллионами строк данных. Я хочу отсортировать, сохранить и применить другие функции к данным позже.
Мне сказали, что это называется «корзинами», но мне неясно, является ли это чем-то предопределенным или определяемым пользователем типом данных. Поэтому мне любопытно, будет ли целесообразно использовать связанный список, массив или другую комбинацию?
Нужно ли беспокоиться о размере файла? Сможет ли большинство компиляторов справиться со всем этим одновременно или мне сначала нужно будет разделить данные (то есть разделить на каждый сегмент, сохранить в своем собственном файле, затем использовать другой код и т. Д.)?
Если # 2 требуется, имеет ли C ++ функциональность для сохранения нескольких файлов за одно выполнение? Значение а) создать bucket1 file.txt; б) заполнить файл bucket1; закрыть файл bucket1; г) создать файл bucket2; …
Итак, я понял из вашего поста, что вы пишете это на C ++. Однако детали немного отличаются от требований сортировки. Но на чем вы сортируете? Все поля интерпретируются как текст? Есть какие-то цифры? Есть несколько ключей?
Если вам абсолютно не нужно писать это на C ++, и вы работаете в Linux, просто вызовите / bin / sort, чтобы выполнить сортировку. Это может показаться отговоркой, но коммерческое программное обеспечение, такое как Talend, даже прибегает к этому.
Но если вам нужно написать новый код на C ++, вот мои рекомендации:
1) Файл CSV экранирован? Другими словами, нуждаются ли в специальной обработке вложенные кавычки и разделители? Вы должны выяснить это в первую очередь.
2) Проверьте это: http://mybyteofcode.blogspot.com/2010/02/parse-csv-file-with-boost-tokenizer-in.html
3) Простое представление отсканированного ввода vector<vector<string> >
, Но это громоздко. Вместо этого, оберните класс вокруг vector<string>
и создать вектор указателей на эти классы, по одному на строку ввода, и вместо этого отсортировать их.
4) Вы должны быть в состоянии сортировать ~ 2M «средних» строк в памяти в эти дни. Просто используйте std :: sort. Но для полной общности вам нужно будет подумать, а что, если оно не умещается в памяти? Наиболее распространенным ответом на это является одновременная сортировка фрагментов, запись результатов на диск, а затем объединение их с использованием очереди приоритетов или аналогичной структуры.
Других решений пока нет …