2012-03-18 22 views
1

我有一個大矩陣0 s和1 s,那大多是0 s。它最初被存儲爲其他列表的25 thousand列表,其中每個列表大約2000個整長。調用np.array時給出MemoryError的列表很大,稀疏列表(數據)

我想把這些放到一個numpy數組中,這是我的程序的另一部分。所以我運行training_data = np.array(data),但這返回MemoryError

爲什麼會發生這種情況?我假設程序處理的內存太多了(這對我來說是令人驚訝的),但是如果是這樣,是否有更好的方法來做到這一點?

回答

1

(短)整數需要兩個字節來存儲。你需要25,000個列表,每個列表有2000個整數;給出

25000*2000*2/1000000 = 100 MB 

這工作得很好我的電腦(4GB RAM)上:

>>> import numpy as np 
>>> x = np.zeros((25000,2000),dtype=int) 

您能夠實例零上述矩陣?

你是否將文件讀入列表的Python列表中,然後將其轉換爲numpy數組?這是一個壞主意;它至少會使內存需求增加一倍。你的數據的文件格式是什麼?

對於稀疏矩陣scipy.sparse提供了各種替代數據類型,這將會更加高效。


編輯:迴應OP的評論。

我有一些其他類的25000實例,每個實例的返回長度約2000。我希望把所有這些列表返回到np.array列表。

那麼,你不知道要超過8GB!要解決這個問題,不要在內存中進行所有這些操作。將數據一次寫入磁盤,然後刪除實例並從numpy讀入文件。

首先做

with open(..., "wb") as f: 
    f = csv.writer(f) 
    for instance in instances: 
     f.writerow(instance.data) 

這會寫所有的數據轉化成一個大十歲上下的CSV文件。然後,您可以使用np.loadtxt

numpy.loadtxt(open(..., "rb"), delimiter=",") 
+0

超過100 MB的方式:)我有8 GB的RAM。 – zebra 2012-03-18 16:23:23

+0

對你的編輯,是的我能夠實例化 – zebra 2012-03-18 16:24:15

+0

爲了你的下一個編輯,我有一些其他類的25000個實例,每個實例都返回一個長度約爲2000的列表。我想把所有這些列表返回到np.array – zebra 2012-03-18 16:26:55