直接在python joblib模块中使用MemmapingPool

时间:2018-06-14 02:27:14

标签: python multiprocessing joblib

joblib模块提供了一个非常易于使用的函数Parallel来简化编码。但是,它始终会在您访问其中任何结果之前收集所有结果。

我需要逐个处理结果,因为结果是占用大量内存的大数组。它们不能同时驻留在内存中。所以我需要首先处理其中的一部分然后丢弃。最初,我使用futures.as_completed中的MultiprocessPool方法,以便在结果可用时立即处理结果。

但现在我还想使用joblib为我管理memmap ed数组。 joblib还有MultiprocessPool这样的界面吗?我稍微研究了一下代码,发现MemmapingPool。但这些都不是关于如何使用它的文档和示例。

我有以下问题:

  1. 我是否像使用MultiprocessPool一样使用它们?
  2. 在这种情况下如何处理Ctrl-C

1 个答案:

答案 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())