【发布时间】:2012-04-01 13:38:14
【问题描述】:
我正在使用 Python 的 multiprocessing 模块来并行处理大型 numpy 数组。这些数组在主进程中使用numpy.load(mmap_mode='r') 进行内存映射。之后,multiprocessing.Pool() 分叉了这个进程(我猜)。
一切似乎都运行良好,除了我得到如下行:
AttributeError("'NoneType' object has no attribute 'tell'",)
in `<bound method memmap.__del__ of
memmap([ 0.57735026, 0.57735026, 0.57735026, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ], dtype=float32)>`
ignored
在单元测试日志中。尽管如此,测试还是通过了。
知道那里发生了什么吗?
使用 Python 2.7.2、OS X、NumPy 1.6.1。
更新:
经过一些调试,我找到了一个代码路径的原因,该路径使用这个内存映射的 numpy 数组的(一小部分)作为Pool.imap 调用的输入。
显然,“问题”在于multiprocessing.Pool.imap 将其输入传递给新进程的方式:它使用pickle。这不适用于mmaped numpy 数组,并且内部中断会导致错误。
我发现 Robert Kern 的 this reply 似乎解决了同样的问题。他建议为imap 输入来自内存映射数组时创建一个特殊的代码路径:在生成的进程中手动内存映射相同的数组。
这将是如此复杂和丑陋,以至于我宁愿忍受错误和额外的内存副本。有没有其他方法可以更轻松地修改现有代码?
【问题讨论】:
标签: python numpy multiprocessing mmap