2013-10-28 59 views
1

代碼:內存錯誤而調用genfromtxt方法

import scipy as sp 
import matplotlib.pyplot as plt 

data=sp.genfromtxt("data/train.tsv", delimiter ="\t", dtype="string", comments=None, skip_header=1) 
x = data[:,0] 
y = data[:,1] 
x = x[~sp.isnan(y)] 
y = x[~sp.isnan(y)] 


DataOfInterest=x["avglinksize"] 
EphemeralOrEvergreen=x["label"] 
plt.scatter(DataOfInterest,EphemeralOrEvergreen) 
plt.title("Training data") 
plt.xlabel("Single feature from training set") 
plt.ylabel("Ephemeral or Evergreen") 
plt.grid() 
plt.show() 

輸出:

蟒蛇GenGraphs.py

Traceback (most recent call last): 
    File "GenGraphs.py", line 4, in <module> 
    data=sp.genfromtxt("data/train.tsv", delimiter ="\t", dtype="string", comments=None, skip_header=1) 
    File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 1746, in genfromtxt 
    output = np.array(data, dtype) 
MemoryError 

我想在對另一TSV文件,以圖一列。

我在這裏誤解了什麼?我還能如何做到這一點?

+0

'train.tsv'有多大? – mdml

+0

@ mtitan8它可以在這裏找到:http://www.kaggle.com/c/stumbleupon/data。它是20.6MB,有27列和7,396行。 –

回答

0

您可以使用np.memmap加載它,它就會要求你約70MB :當你刪除mdel m或當您關閉了Python控制檯

import numpy as np 
with open('train.tsv') as f: 
    mm = np.memmap('test.memmap', shape=(7395, 27), dtype='|S4000', mode='w+') 
    f.next() 
    for i, l in enumerate(f): 
     mm[i,:] = l.strip().replace('"','').split('\t') 

文件被保存。創建文件後,可能需要將模式更改爲r+

你可以使用memmap數組,就好像它是一個普通的數組一樣,它可以讓你只使用感興趣的部分。

0

Python耗盡內存,因爲您嘗試創建的對象只是很大。原因是你的數據包含一些非常大的字符串(注意到你上一個問題)。

您創建的陣列data只有一個dtype。這個dtype的大小被選擇爲足夠大以保存數據中最長的字符串。但不管其他內容如何,​​對於數據中的每個字段,都會分配相同數量的內存!由於這個原因,陣列的內存大小可能會變得比數據文件大得多!

正如你可以指定每一列的D型的解決方案,但更容易是隻加載你實際需要的數據:

data = sp.genfromtxt('data/train.tsv', 
        delimiter ='\t', 
        names=True, 
        usecols='avglinksize','label'))