2013-06-09 3 views
2

Я пытаюсь обработать файл CSV с ~ 73 миллиардами строк,
Я храню обработанные строки в коллекции python collections.defaultdict, имеющей строку как ключ и кортежи как значение, однако для хранения этой структуры данных в словаре выполняется ~ 100 секунд для хранения 50K строк.Как обрабатывать огромный файл CSV в python?

Я обрабатываю CSV-файл в кусках 50K строк, чтобы убедиться, что система не выходит из памяти или во избежание операций по обмену ввода-вывода на диске.

Позже я загружаю обработанные CSV-файлы в таблицу и делаю FULL OUTER JOIN для получения комбинированного результата.

Пример ROW из CSV ID, значение: Структура

"10203","http://google.com/goo.gl?key='universe'&value='somedata'" 

данных:

dt = {'goog': [(10203, 1), ...} 

В основном я пытаюсь реализовать алгоритм для полной функции поиска текста - для этого мне нужно поддерживать позиции значения в частях из 4 символов с ассоциированным ID.

+0

Возможный дубликат [Параллельная обработка большого .csv-файла в Python] (http://stackoverflow.com/questions/8424771/parallel-processing-of-a-large-csv-file-in-python) – hjpotter92

+2

Когда вы обрабатываете много строк, вы явно должны обрабатывать «на лету», так как вы не можете хранить это много данных в памяти на большинстве машин (73 миллиарда строк =, вероятно, более 1 ТБ памяти?). Не зная больше о структуре данных, будет сложно дать какие-либо советы; но почти наверняка структура dict не является самым эффективным способом. Каковы данные, и как вы их агрегируете? – Floris

+0

Что случилось с тем, что вы делаете? почему вы думаете, что 100 секунд для 50K строк медленнее? Также вы можете отправить одну строку из файла CSV для нашего понимания? –

ответ

0

Наконец-то я нашел идеальное решение, наилучшим образом подходящее для моего текущего требования.

Раньше эта задача выполнялась около ~ 20-24 часов, и теперь она занимает около получаса.

Модель программирования, которую я искал, была Карта Уменьшить модель программирования.Который был прост в использовании и прост в кодировке для требования, которое у меня было.

Его действительно быстрее & эффективно написано: Я использую утилиту gpmapreduce с языком программирования Python для этого же.

Благодаря: @ Srikar-Appal его almsot похож на его четвертое решение - на основе которого я вдохновил использовать модель mapreduce.

5

Вот некоторые вещи, которые приходят на ум -

  1. Как @Burhad предположить, почему вы не можете загрузить этот файл непосредственно в БД? Любая строковая обработка, как вы делаете, может быть выполнена в обычных СУБД, таких как MySQL. У вас есть функция строки, которую вы знаете. Простая процедура DB могла бы сделать все это внутри самой БД, даже не записывая данные в файл.
  2. Если вы не хотите использовать вышеуказанный подход. Я предлагаю вам попробовать это. Разделите файл, чтобы сказать n файлы меньшего размера. Запустите мастер-процесс, который создает подпроцессы forks n для обработки этих n файлов chunk параллельно. таким образом за 100 секунд теоретически получится обработано n * 50,000 строк. Обратите внимание, что я говорю «теоретически», поскольку, если все это происходит на одном жестком диске, жесткий диск может не передавать данные одновременно. Таким образом, может возникнуть задержка в удовлетворении одновременных запросов (но опять-таки алгоритмы ввода-вывода, которые выполняются в современных операционных системах, кэшируют часть считываемого файла, что может дать вам приблизиться к вышеупомянутым цифрам).
  3. Расширение вышеуказанного подхода заключается в использовании нескольких жестких дисков, которые являются частью одного и того же уровня рейда на одном и том же локальном компьютере.
  4. Если вам требуется еще большая пропускная способность, подумайте о распределенных вычислениях. Как говорят x machines каждый с y harddisks. Сделайте x*y chunks вашего файла и поместите их в эти машины. и запустите свою программу обработки. Итак, вы обрабатываете x*y*50000 rows в течение примерно 100 секунд. Пропускная способность увеличивается с количеством используемых машин и жестких дисков. Возможно, вам придется иметь дело с некоторыми новыми проблемами распределенных вычислений (такими как доступность, отказоустойчивость и т. Д.), Но все же ...

Точка 2, 3 и 4 основываются на предположении, что каждая строка в файле CSV могут обрабатываться независимо и что между рядами нет зависимости.

+1

Много хороших вариантов – korylprince

Смежные вопросы