2013-10-28 61 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'))