Я использую модуль Python multiprocessing
для параллельной обработки больших массивов numpy. Массивы преобразуются в память с использованием numpy.load(mmap_mode='r')
в основном процессе. После этого multiprocessing.Pool()
вызывает процесс (я полагаю).
Кажется, все работает нормально, за исключением того, что я получаю такие строки, как:
AttributeError (объект 'NoneType' не имеет атрибута 'tell' ",) в
<bound method memmap.__del__ of memmap([ 0.57735026, 0.57735026, 0.57735026, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ], dtype=float32)>
игнорируется
в журналах unittest. Тем не менее тесты проходят отлично.
Любая идея, что там происходит?
Использование Python 2.7.2, OS X, NumPy 1.6.1.
UPDATE:
После некоторой отладки я искал причину пути кода, который использовал (небольшой фрагмент) этот массив с памятью с памятью в качестве входа в вызов Pool.imap
.
По-видимому, "проблема" связана с тем, как multiprocessing.Pool.imap
передает свой вход в новые процессы: он использует pickle. Это не работает с mmap
ed numpy массивами и чем-то внутри разрывов, что приводит к ошибке.
Я нашел этот ответ Робертом Керном, который, похоже, решает ту же проблему. Он предлагает создать специальный путь кода, когда вход imap
поступает из массива с отображением памяти: память-сопоставление одного массива вручную в порожденном процессе.
Это было бы настолько сложно и уродливо, что я предпочел бы жить с ошибкой и дополнительными копиями памяти. Есть ли другой способ, который будет легче при изменении существующего кода?