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