импорт и обработка данных из файла CSV в Delphi - PullRequest
7 голосов
/ 22 февраля 2012

У меня была задача перед собеседованием, которую я выполнил, и решение работает, однако я был уценен и не получил интервью из-за использования набора данных TADOD. Я в основном импортировал файл CSV, который заполнил набор данных, данные должны были обрабатываться особым образом, поэтому я использовал фильтрацию и сортировку набора данных, чтобы убедиться, что данные были упорядочены так, как я хотел, а затем я сделал логическая обработка в цикле while. В ответе было сказано, что это плохо, поскольку для больших файлов это будет очень медленно.

Мой главный вопрос здесь заключается в том, что если набор данных в памяти медленен для обработки больших файлов, что было бы лучшим способом получить доступ к информации из файла CSV. Должен ли я использовать списки строк или что-то подобное?

Ответы [ 2 ]

4 голосов
/ 22 февраля 2012

Это действительно зависит от того, насколько «большие» и доступные ресурсы (в данном случае ОЗУ) для задачи.

«В полученном отзыве говорилось, что это плохо, поскольку для больших файлов это будет очень медленно».

CSV-файлы обычно используются для перемещения данных (в большинстве случаев, с которыми я сталкивался, файлы составляют ~ 1 МБ + до ~ 10 МБ, но это не значит, что другие не будут сбрасывать больше данных в формате CSV), не слишком заботясь (если вообще) об импорте / экспорте, так как это чрезвычайно упрощенно.

Предположим, у вас есть CSV-файл размером 80 МБ, теперь это файл, который вы хотите обработать порциями, в противном случае (в зависимости от вашей обработки) вы можете съесть сотни МБ ОЗУ, в этом случае я бы сделал следующее:

while dataToProcess do begin
  // step1
  read <X> lines from file, where <X> is the max number of lines 
  you read in one go, if there are less lines(i.e. you're down to 50 lines and X is 100)
  to process, then you read those
  // step2
  process information
  // step3
  generate output, database inserts, etc.
end;

В приведенном выше случае вы загружаете не 80 МБ данных в ОЗУ, а только несколько сотен КБ, а остальное вы используете для обработки, то есть связанные списки, динамические запросы вставки (пакетная вставка) и т. Д.

"... однако я был уценен и не получил интервью из-за того, что использовал набор данных TADOD."

Я не удивлен, они, вероятно, искали, способны ли вы создать алгоритм (ы) и предоставить простые решения на месте, но без использования "готовых" решений.

Возможно, они думали о том, чтобы увидеть, как вы используете динамические массивы, и создали один (или несколько) алгоритмов сортировки.

«Должен ли я использовать списки строк или что-то подобное?»

Ответ, возможно, был таким же, опять же, я думаю, они хотели посмотреть, как вы «работаете».

0 голосов
/ 23 сентября 2015

Интервьюер был совершенно прав.

Правильное, масштабируемое и самое быстрое решение для любого среднего файла вверх - использовать «внешнюю сортировку».

«Внешняя сортировка» - это двухэтапный процесс, первым этапом которого является разбиение каждого файла на управляемые и отсортированные файлы меньшего размера. Второй этап - объединить эти файлы обратно в один отсортированный файл, который затем можно обрабатывать построчно.

Это чрезвычайно эффективно для любого CSV-файла с более чем 200 000 строк. Объем памяти, в которой выполняется процесс, можно контролировать, и, таким образом, можно избежать опасности нехватки памяти.

Я реализовал много таких процессов сортировки и в Delphi рекомендовал бы комбинацию классов TStringList, TList и TQueue.

Удачи

...