Высокое использование памяти только при многопроцессорной обработке - PullRequest
5 голосов
/ 25 апреля 2010

Я пытаюсь использовать многопроцессорную библиотеку python для повышения производительности. В частности, я использую функцию map . Теперь, по какой-то причине, когда я заменяю его одним обработанным аналогом, я не получаю большого использования памяти. Но использование многопроцессорной версии карты вызывает переполнение моей памяти. Для протокола, я делаю что-то, что может легко увеличить нагрузку на память, но какая разница между ними, чтобы вызвать такую ​​резкую разницу?

1 Ответ

4 голосов
/ 25 апреля 2010

Вы понимаете, что многопроцессорность не использует потоки, да? Я говорю это потому, что вы упоминаете «однопоточный аналог».

Отправляете ли вы много данных через multiprocessing map? Вероятной причиной является многопроцессорная обработка сериализации во многих случаях. multiprocessing использует pickle, который обычно занимает больше памяти, чем данные, которые он обрабатывает. (В некоторых случаях, особенно в системах с fork(), где новые процессы создаются при вызове метода map, он может избежать сериализации, но всякий раз, когда ему необходимо отправить новые данные в существующий процесс, он не может этого сделать.)

Поскольку с multiprocessing вся фактическая работа выполняется в отдельных процессах, память вашего основного процесса не должна зависеть от реальных операций, которые вы выполняете. Однако общее использование памяти значительно возрастает, потому что у каждого рабочего процесса есть копия данных, которые вы передали. Иногда это память для копирования при записи (в тех же случаях, что и без сериализации) в системах с CoW, но использование памяти Python таково, что она быстро записывается и, таким образом, копируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...