numpy против multiprocessing и mmap

Я использую модуль Python multiprocessingдля параллельной обработки больших массивов numpy. Массивы отображаются в памяти с помощью numpy.load(mmap_mode='r')в главном процессе. После этого multiprocessing.Pool()разветвляет процесс (я полагаю).

Кажется, все работает нормально, за исключением того, что я получаю такие строки, как:

AttributeError("'NoneType' object has no attribute 'tell'",)
  in ``
     ignored

в журналах unittest. Тем не менее тесты проходят нормально.

Есть идеи, что там происходит?

Использование Python 2.7.2, OS X, NumPy 1.6.1.


ОБНОВЛЕНИЕ:

После некоторой отладки я выследил причину пути кода, который использовал (небольшой фрагмент) этого массива numpy с отображением памяти в качестве входных данных для вызова Pool.imap. .

По-видимому, «проблема» заключается в том, как multiprocessing.Pool.imapпередает свои данные новым процессам: он использует pickle. Это не работает с массивами mmaped numpy, и что-то внутри ломается, что приводит к ошибке.

Я нашел этот ответРоберта Керна, который, похоже, касается того же вопроса. Он предлагает создать специальный путь кода для случаев, когда входные данные imapпоступают из массива с отображением памяти: сопоставление памяти того же массива вручную в порожденном процессе.

Это было бы настолько сложно и уродливо, что я предпочел бы жить с ошибкой и дополнительными копиями памяти.Есть ли какой-либо другой способ, который бы облегчил изменение существующего кода?

20
задан martineau 25 November 2018 в 12:13
поделиться