Я использую модуль 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. Это не работает с массивами mmap
ed numpy, и что-то внутри ломается, что приводит к ошибке.
Я нашел этот ответРоберта Керна, который, похоже, касается того же вопроса. Он предлагает создать специальный путь кода для случаев, когда входные данные imap
поступают из массива с отображением памяти: сопоставление памяти того же массива вручную в порожденном процессе.
Это было бы настолько сложно и уродливо, что я предпочел бы жить с ошибкой и дополнительными копиями памяти.Есть ли какой-либо другой способ, который бы облегчил изменение существующего кода?