0

考虑一个大到适合内存的二维数组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))

4

1 回答 1

0

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

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

翻转数组分块的操作通常需要许多块一次在内存中。我怀疑您主要使用 arange 作为测试数据集。我建议尝试使用支持分块(如 1 或 0)的函数,看看您的问题是否仍然存在。

da.ones((10, 1000000), chunks="128 MiB")
于 2020-06-13T15:16:06.633 回答