3

我正在尝试使用将 1.25 GB 数据集导入 pythondask.array

该文件是一个 1312*2500*196 的数组uint16。我需要将其转换为float32数组以供以后处理。

我已经设法将这个 Dask 数组拼接在一起uint16,但是当我尝试转换为时float32出现内存错误

不管我对块大小做什么,我都会遇到内存错误。

我通过以 100 行连接数组来创建数组(将 2500 维分解为 100 行的小片段,因为dask无法原生读取.RAW图像文件,我必须使用它numpy.memmap()来读取文件然后创建数组。下面我将提供“尽可能短”的代码片段:

我尝试了两种方法:

1)创建完整的uint16数组,然后尝试转换为float32

(注意:这memmap是一个 1312x100x196 数组,行数范围从 0 到 24)

for i in range(lines):
    NewArray = da.concatenate([OldArray,Memmap],axis=0)
    OldArray = NewArray
return NewArray

然后我用

Float32Array = FinalArray.map_blocks(lambda FinalArray: FinalArray * 1.,dtype=np.float32)

在方法 2 中:

for i in range(lines):
    NewArray = da.concatenate([OldArray,np.float32(Memmap)],axis=0)
    OldArray = NewArray
return NewArray

这两种方法都会导致内存错误。

这有什么原因吗?

我读到该dask数组能够进行多达 100 GB 的数据集计算。

我尝试了所有块大小(从小到 10x10x10 到单行)

4

1 回答 1

1

da.from_array您可以直接使用函数从 numpy memmap 数组创建 dask.array

x = load_memmap_numpy_array_from_raw_file(filename)
d = da.from_array(x, chunks=...)

astype您可以使用该方法更改 dtype

d = d.astype(np.float32)
于 2015-10-05T05:07:00.263 回答