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