我正在尝试使用 dask.array
该文件是 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到单行)
答案 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
方法
d = d.astype(np.float32)