在dask数组

时间:2015-10-04 22:50:37

标签: python arrays numpy dask numpy-memmap

我正在尝试使用 dask.array

将1.25 GB数据集导入到python中

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

我已设法在uint16中将此Dask数组拼接在一起,但是当我尝试转换为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到​​单行)

1 个答案:

答案 0 :(得分: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)