2013-07-26 3 views
6

Я потратил неделю на обработку некоторых gnarly текстовых файлов - некоторые в сотне миллионов рядов.пределы python в параллельной обработке файлов

Я использовал python для открытия, разбора, преобразования и вывода этих файлов. Я выполнял задания параллельно, часто 6 -8 за раз, на массивном 8-процессорном 16-ядерном блоке EC2, используя SSD.

И я бы сказал, что выход плохо на 0,001% записи, как:

Expected output: |1107|2013-01-01 00:00:00|PS|Johnson|etc. 

Actual output: |11072013-01-01 00:00:00|PS|Johnson|etc. 
       or |1107|2013-01-01 :00:00|PS|Johnson 

Почти всегда, проблема не GIGO, а то, что Python не удалось написать разделитель или часть поле даты. Таким образом, я предполагаю, что я перегружаю SSD этими заданиями или, вернее, компьютер не работает с дросселем python на основе конкуренции записи для диска.

Мой вопрос заключается в следующем: как получить самую быструю обработку из этой коробки, но не вызвать такие ошибки «писать»?

+0

Не те ли ошибки записи из-за вашего поведения? Маловероятно, что SSD перегружен. Вы пишете один файл из разных процессов/потоков? – Xaqq

+0

Просьба подробно остановиться на «вашем способе делать вещи» - мой способ написать файлы, используя csv.writer с разделителем каналов. SSD обрабатывает 50 тыс. Записей, пишет вторую. –

+2

Что я имел в виду, вы пишете одновременно один и тот же файл? Потому что, если это так, то это, вероятно, станет причиной вашей проблемы. – Xaqq

ответ

1

Вы используете модуль multiprocessing (отдельные процессы) или просто используете потоки для параллельной обработки?

Я очень сомневаюсь, что проблема с SSD. Или питон. Но, может быть, модуль csv имеет состояние гонки и не является потокобезопасным?

Также проверьте свой код. И входы. Являются ли «плохие» записи последовательными? Можете ли вы воспроизвести их? Вы упоминаете GIGO, но на самом деле не исключаете это («Почти всегда, ...»).

+0

, не используя модуль многопроцессорности, - будет исследовать, спасибо. Я просто хочу исключить некоторые вещи, поэтому мы с тобой «сомневаемся» в том, что SSD может быть проблемой, но я ищу ваш опыт здесь - будет ли конфликт устройств для обработки паузы блочного устройства? будет ли запись поставлена ​​в очередь? при сильной нагрузке персонажи просто не будут записаны? Писатель CSV подозревается, так как есть вероятность, что в файле есть мусор, который останавливает нормальную обработку. Как только я разумно управляю всем остальным, GIGO должен быть заключением. –

+2

Если устройство не может следовать, тогда 'write' будет блокироваться. Таким образом, символы не будут записаны, он просто подождёт, пока диск станет свободным, и напишет. – Xaqq

+0

Преимущества использования модуля 'csv' умеренно низки, поэтому я, вероятно, заменил бы его самозаписываемым кодом, который я бы обеспечил, чтобы быть потокобезопасным. Вероятно, тогда проблема исчезла. Следующая задача - найти причину в 'csv', исправить ее и дать исправление обратно сообществу ;-) – Alfe

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