【问题标题】:Memory Error while calling genfromtxt method调用 genfromtxt 方法时出现内存错误
【发布时间】:2013-11-07 21:28:16
【问题描述】:

代码:

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()

输出:

python 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 文件中的一列与另一列进行对比。

我在这里误解了什么?我还能怎么做?

【问题讨论】:

标签: python arrays numpy


【解决方案1】:

Python 内存不足,因为您尝试创建的对象太大了。原因是您的数据包含一些非常大的字符串(从您之前的问题中注意到这一点)。

您创建的数组data 只有一个dtype。选择此 dtype 的大小足以容纳数据中最长的字符串。但不管其他内容如何,​​为数据中的每个字段分配相同数量的内存!由于这个原因,数组在内存中的大小可能会比数据文件的大小要大得多!

作为一种解决方案,您可以为每列指定 dtype,但更简单的是只加载您实际需要的数据:

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

【讨论】:

    【解决方案2】:

    您可以使用np.memmap 加载它,这需要大约 70MB:

    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')
    

    当您使用 del m 删除 m 或关闭 Python 控制台时,文件将被保存。文件创建后可能需要将模式更改为r+

    您可以像使用普通数组一样使用 memmap 数组,这样您就可以只取感兴趣的部分。

    【讨论】:

      猜你喜欢
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多