2015-10-04 54 views
3

使用FLOAT32当我试图使用dask.array内存错误在DASK阵列

文件导入1.25 GB数据集成蟒是uint16是一个1312 * 2500 * 196阵列。我需要将其转换为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数组能够完成高达100GB的数据集计算。

我尝试了所有的块大小(从小10x10x10到​​单个线)

回答

1

可以从numpy的MEMMAP阵列直接与da.from_array函数创建dask.array

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

你可以使用astype方法更改dtype

d = d.astype(np.float32)