2015-10-04 50 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)