存储“ dask.array.map_blocks”输出时限制内存占用

时间:2020-05-28 22:13:59

标签: python dask zarr

考虑将2D数组X扩大到适合内存的大小,在我的情况下,它以Zarr格式存储,但这没关系。我想在数组上逐块映射函数并保存结果,而无需将整个数组加载到内存中。例如,

import dask.array as da
import numpy as np

X = da.arange(10000000,
    dtype=np.int32).reshape((10,1000000)).rechunk((10,1000))

def toy_function(chunk):
    return np.mean(chunk,axis=0)

lazy_result = X.map_blocks(toy_function)

lazy_result.to_zarr("some_path")

是否有一种方法可以限制一次评估的块数?在我的用例中,lazy_result[:,:1000].compute()适合内存,但是lazy_result.compute()对于内存来说太大了。当我尝试写Zarr时,内存使用量会增加,直到达到最大值并被杀死为止。我可以这样做而不必造成诸如for i in range(1000): lazy_result[:,(i*1000):((i+1)*1000)].to_zarr('some_path'+str(i))

这样的不便

1 个答案:

答案 0 :(得分:0)

我怀疑您的问题实际上出在这里如何构造原始数据:

X = da.arange(10000000,
    dtype=np.int32).reshape((10,1000000)).rechunk((10,1000))

围绕数组的块进行翻转的操作通常需要立即将许多块存储在内存中。我怀疑您主要是将arange用作测试数据集。我建议尝试使用支持分块(例如1或0)的函数,并查看问题是否仍然存在。

da.ones((10, 1000000), chunks="128 MiB")