考虑将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))
答案 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")