在python作业库模块中直接使用MemmapingPool

在python作业库模块中直接使用MemmapingPool,python,multiprocessing,joblib,Python,Multiprocessing,Joblib,joblib模块提供了一个非常易于使用的函数Parallel,以简化编码。但是,它总是在您访问任何结果之前收集所有结果 我需要逐个处理结果,因为结果是占用大量内存的大数组。它们不能同时驻留在内存中。所以我需要先处理其中的一部分,然后丢弃。最初,我使用的是futures.as_completed方法,它来自MultiprocessPool,这样当结果可用时就可以立即处理 但是现在我还想使用joblib为我管理memmaped数组。joblib是否也有类似于MultiprocessPool的接口?我

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

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

但是现在我还想使用
joblib
为我管理
memmap
ed数组。
joblib
是否也有类似于
MultiprocessPool
的接口?我查看了一下代码,发现
MemmapingPool
。但这些都不是关于如何使用它的文档和示例

我有以下问题:

  • 我使用它们是否与使用
    多处理器池
    相同
  • 在这种情况下如何处理
    Ctrl-C

  • 在研究和阅读了joblib的源代码之后,我找到了一种方法,手动管理memmapped数组。已将代码段发布到

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