直接使用 python joblib 模块中的 MemmapingPool

directly use MemmapingPool in python joblib module

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

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

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

我有以下问题:

  1. 我使用它们和使用 MultiprocessPool 一样吗?
  2. 如何处理Ctrl-C这种情况?

经过一些研究和阅读 joblib 的源代码后,我找到了一种通过手动管理内存映射数组来实现的方法。代码片段已发布到 gist.

最简单的使用方法是通过wrap函数,它会自动检测memmap并将其包装在SharedArray中。如果 return 值是内存映射,它也将被包装在 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())