Я сталкиваюсь со многими "смущающими параллельными" проектами, которые я хотел бы распараллелить с модулем multiprocessing
. Тем не менее, они часто включают чтение в огромных файлах (более 2 гб), обработку их по строкам, запуск основных вычислений, а затем запись результатов. Каков наилучший способ разделить файл и обработать его с помощью модуля многопроцессорности Python? Должны использоваться Queue
или JoinableQueue
в multiprocessing
? Или сам модуль Queue
? Или, должен ли я сопоставлять файл итерабельным по пулу процессов с помощью multiprocessing
? Я экспериментировал с этими подходами, но накладные расходы огромны в распределении данных по строкам. Я остановился на конструкции легких фильтров, используя cat file | process1 --out-file out1 --num-processes 2 | process2 --out-file out2
, который передает определенный процент от первого ввода процесса непосредственно ко второму входу (см. этот пост), но я хотел бы иметь решение, содержащееся полностью в Python.
Удивительно, но документация на Python не предлагает канонического способа сделать это (несмотря на длительный раздел руководства по программированию в документации multiprocessing
).
Спасибо, Vince
Дополнительная информация: Время обработки на строку варьируется. Некоторые проблемы бывают быстрыми и едва ли связаны с I/O, некоторые связаны с ЦП. Связанные с процессором, не зависящие от задачи задачи получат сообщение от распараллеливания, так что даже неэффективные способы присвоения данных функции обработки все равно будут полезны с точки зрения времени настенных часов.
Первым примером является script, который извлекает поля из строк, проверяет множество поразрядных флагов и записывает строки с определенными флагами в новый файл в совершенно новом формате. Это похоже на проблему с привязкой к I/O, но когда я запускал ее с моей дешевой параллельной версией с помощью труб, она была примерно на 20% быстрее. Когда я запускаю его с пулом и картой, или в очереди в multiprocessing
, он всегда на 100% медленнее.