直接使用 python joblib 模块中的 MemmapingPool
directly use MemmapingPool in python joblib module
joblib
模块提供了一个非常易于使用的功能 Parallel
来简化编码。但是,它总是在您访问任何结果之前收集所有结果。
我需要一个一个地处理结果,因为结果是大数组占用大量内存。它们不能同时驻留在内存中。所以我需要先处理其中的一部分,然后丢弃。最初,我使用 MultiprocessPool
中的 futures.as_completed
方法,以便在结果可用时立即处理。
但现在我也想使用 joblib
为我管理 memmap
ed 数组。 joblib
是否也有MultiprocessPool
这样的界面?我稍微研究了一下代码,发现 MemmapingPool
。但是这些不是关于如何使用它的文档和示例。
我有以下问题:
- 我使用它们和使用
MultiprocessPool
一样吗?
- 如何处理
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())
joblib
模块提供了一个非常易于使用的功能 Parallel
来简化编码。但是,它总是在您访问任何结果之前收集所有结果。
我需要一个一个地处理结果,因为结果是大数组占用大量内存。它们不能同时驻留在内存中。所以我需要先处理其中的一部分,然后丢弃。最初,我使用 MultiprocessPool
中的 futures.as_completed
方法,以便在结果可用时立即处理。
但现在我也想使用 joblib
为我管理 memmap
ed 数组。 joblib
是否也有MultiprocessPool
这样的界面?我稍微研究了一下代码,发现 MemmapingPool
。但是这些不是关于如何使用它的文档和示例。
我有以下问题:
- 我使用它们和使用
MultiprocessPool
一样吗? - 如何处理
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())