joblib
模块提供了一个非常易于使用的函数Parallel
来简化编码。但是,它始终会在您访问其中任何结果之前收集所有结果。
我需要逐个处理结果,因为结果是占用大量内存的大数组。它们不能同时驻留在内存中。所以我需要首先处理其中的一部分然后丢弃。最初,我使用futures.as_completed
中的MultiprocessPool
方法,以便在结果可用时立即处理结果。
但现在我还想使用joblib
为我管理memmap
ed数组。 joblib
还有MultiprocessPool
这样的界面吗?我稍微研究了一下代码,发现MemmapingPool
。但这些都不是关于如何使用它的文档和示例。
我有以下问题:
MultiprocessPool
一样使用它们?Ctrl-C
?答案 0 :(得分:0)
经过研究并阅读了joblib的源代码,我找到了一种方法,可以通过手动管理映射数组来实现。一个代码段已发布到gist。
最简单的使用方法是通过wrap
函数,该函数将自动检测memmap
并将其包装在SharedArray中。如果它是一个内存映射,则返回值也将包装在SharedArray中。示例:
x = np.memmap('data', dtype=int, mode='w+', shape=100)
x[:] = np.random.randint(0, 100, 100)
with concurrent.futures.ProcessPoolExecutor(2) as pool:
fut1 = pool.submit(*wrap(np.multiply, x[:50], 2))
fut2 = pool.submit(*wrap(np.multiply, x[50:], -2))
print(fut1.result()) # or fut1.result().asarray() in case the function returns a memmap
print(fut2.result())