2013-04-17 105 views
2

我需要讀取一個大2.5GB的文件。我用下面的syntx:有效地管理內存和python處理

import numpy as np 
limit=4269*352*288*3 
mat1=np.zeros(limit, dtype='uint8') 
mat1=np.fromfile("path/to/file", "uint8", limit) 

我現在需要重塑這個數組:

mat_new=np.zeros([4269, 288, 352, 3], dtype='uint8') 
mat_new=np.transpose(np.reshape(mat1,[4269,3,288,352]), [0,2,3,1]) 

這需要大約35秒對我的4GB內存,i7的第二代系統。 任何方式,我可以讓它更快。因爲這只是我的計劃的開始和更復雜的事情。我從此不需要mat1

此外,我只讀了一半的文件,因爲Python給了我'最大內存達到'的錯誤。

+4

您不需要先創建一個零數組,您可以刪除'np.zeros()'行。從文件中讀取數據很慢,請查看您的代碼以確定'np.fromfile()'的時間消耗。 – HYRY

+0

大約需要18秒鐘才能讀取1.25GB的數據!和12-14秒重塑! – change

回答

1

它需要大約18秒內讀取數據

這是約70MB /秒,即1.25GB的,速度可能是由你的磁盤I/O性能的限制。

如果你不需要整個文件;你可以使用numpy.memmap

mat = np.memmap("path/to/file", shape=(4269,288,352,3)) 

爲了避免內存錯誤,請使用就地操作例如爲:

mat_new = mat1.transpose(0,2,3,1) # no data copying 

而且作爲@HYRY said,刪除不必要的np.zeros()