簡體   English   中英

在python中處理一個非常大的數據集 - 內存錯誤

[英]Processing a very very big data set in python - memory error

我正在嘗試使用python中的csv模塊處理從csv文件獲取的數據。 這里有大約50列和401125行。 我使用以下代碼塊將該數據放入列表中

csv_file_object = csv.reader(open(r'some_path\Train.csv','rb'))
header = csv_file_object.next()
data = []
for row in csv_file_object:
    data.append(row)

我可以使用len(數據)獲取此列表的長度並返回401125.我甚至可以通過調用列表索引來獲取每個單獨的記錄。 但是當我嘗試通過調用np.size(data)來獲取列表的大小時(我將numpy導入為np),我獲得了以下堆棧跟蹤。

MemoryError Traceback(最近一次調用last)in()----> 1 np.size(data)

C:\\ Python27 \\ lib \\ site-packages \\ numpy \\ core \\ fromnumeric.pyc in size(a,axis)2198返回a.size 2199除AttributeError: - > 2200返回asarray(a).size 2201 else:2202試試:

asarray中的C:\\ Python27 \\ lib \\ site-packages \\ numpy \\ core \\ numeric.pyc(a,dtype,order)233 234“”“ - > 235返回數組(a,dtype,copy = False,order = order )236 237 def asanyarray(a,dtype = None,order = None):

的MemoryError:

我甚至無法使用列表索引將該列表分成多個部分或將此列表轉換為numpy數組。 它給出了同樣的內存錯誤。

我該如何處理這種大數據樣本。 有沒有其他方法來處理像這樣的大型數據集。

我在Windows 7專業版中使用ipython筆記本。

正如@DSM在評論中所指出的,你得到內存錯誤的原因是在列表上調用np.size會先將數據復制到數組中然后獲取大小。

如果您不需要將其作為numpy數組使用,則不要調用np.size 如果你確實想要類似numpy的索引選項,那么你有幾個選擇。

您可以使用pandas ,它用於處理大型不一定數值的數據集,並且有一些很好的幫助器和實現的東西。

如果你不想這樣做,你可以定義一個numpy 結構數組,並在第一個地方逐行填充它,而不是制作一個列表並復制到它中。 就像是:

fields = [('name1', str), ('name2', float), ...]
data = np.zeros((num_rows,), dtype=fields)

csv_file_object = csv.reader(open(r'some_path\Train.csv','rb'))
header = csv_file_object.next()
for i, row in enumerate(csv_file_object):
    data[i] = row

您還可以根據header定義fields ,這樣您就不必手動輸入所有50個列名,但您必須為每個列指定數據類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM