2010-04-24 8 views
4

Я пытаюсь использовать python для получения некоторой производительности для задачи, которая может быть сильно распараллелена с помощью http://docs.python.org/library/multiprocessing.Как выбрать chunksize для многопроцессорности python с большими наборами данных

При взгляде на свою библиотеку они говорят, что используют размер блока для очень длинных итераций. Теперь, мой итерабельный недолго, один из содержащихся в нем dicts: ~ 100000 записей, с кортежами в качестве ключей и массивами numpy для значений.

Как я могу установить chunksize для обработки этого и как я могу быстро передать эти данные?

спасибо.

ответ

2

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

+0

О, это имеет смысл. В настоящее время рабочие захватывают гигантский диктофон, копируют его, модифицируют, а затем отправляют обратно свою версию. (не совсем легкий). Поскольку вы, похоже, знакомы с его многопроцессорностью на python: если гигантский диктофон, где читать только, есть способ разрешить всем рабочим доступ к своим данным по мере необходимости эффективно? (это было бы легко с потоками, но с многопроцессорной обработкой это становится сложно быстро) – Sandro

+0

Если вы не в Windows, и вы делаете это «только для чтения», являетесь частью процесса * перед *, вы создаете рабочих и храните его в (например) глобальном или закрытом локальном, все рабочие могут получить к нему доступ, не страдая сериализацией. –

+0

Э-э, я просто понимаю, что использую неправильную терминологию. Я использую функцию Pool.map_async() для выполнения всего этого. Правильно ли я предполагаю, что с помощью карты нет решения, только путем разветвления. Есть ли серьезные затраты на объединение вместе? – Sandro