2012-07-14 52 views
2

我有一個50,000x5,000矩陣(浮點)文件。當使用x = np.genfromtxt(readFrom, dtype=float)將文件加載到內存中,我收到以下錯誤消息:內存錯誤:numpy.genfromtxt()

File "C:\Python27\lib\site-packages\numpy\lib\npyio.py", line 1583, in genfromtxt for (i, converter) in enumerate(converters)])
MemoryError

欲整個文件加載到內存,因爲我計算使用各SciPy的矢量之間的歐氏距離。 dis = scipy.spatial.distance.euclidean(x[row1], x[row2])

是否有任何有效的方法來將巨大的矩陣文件加載到內存中。

謝謝。

Update:

我設法解決這個問題。這是我的解決方案。我不確定它是否有效或邏輯正確,但對我來說工作正常:

x = open(readFrom, 'r').readlines() 
y = np.asarray([np.array(s.split()).astype('float32') for s in x], dtype=np.float32) 
.... 
dis = scipy.spatial.distance.euclidean(y[row1], y[row2]) 

請幫我改進我的解決方案。

+1

計算所有向量對的距離將花費比加載文件長得多的時間。重新檢查一下,如果你真的需要所有的矢量對。另外,你將需要至少25 * 10^7 * 4 = 10^9字節,也許2 * 10^9字節 - 後者在32位系統上是不可行的。 – krlmlr 2012-07-14 16:28:02

+0

看看http://stackoverflow.com/q/1896674/1301710 – bmu 2012-07-14 17:49:48

回答

1

你實際使用8個字節的浮動,因爲Python的float對應到C的double(至少在大多數系統上):

a=np.arange(10,dtype=float) 
print(a.dtype) #np.float64 

您應指定數據類型爲np.float32。根據您的操作系統,以及它是32位還是64位(以及是否使用32位python與64位python),可供numpy使用的地址空間可能小於4Gb,這可能也是一個問題。

+0

即使我使用'dtype = np.float32',我得到了內存錯誤。 – Maggie 2012-07-14 16:34:46

+0

@Mahin如果你只是這樣做:>>> a = np.zeros((50000,5000),dtype = np.float32); a = 1'而不是你的'np.genfromtxt'? – mgilson 2012-07-14 16:45:56

+0

它工作正常。沒有內存錯誤 – Maggie 2012-07-14 16:51:54

1

根據您的操作系統和Python版本,很可能您永遠無法分配1GB陣列(mgilson的答案在此處顯示)。問題不在於內存不足,而在於連續使用內存。如果您使用的是32位計算機(尤其是運行Windows),則無法添加更多內存。轉向64位體系結構可能會有所幫助。

使用較小的數據類型當然可以提供幫助;取決於您使用的操作,16位浮點數或甚至8位整數可能就足夠了。

如果這些都不起作用,那麼你不得不承認數據只是不適合內存。你必須分段處理它(在這種情況下,將數據存儲爲HDF5數組可能非常有用)。