1

コード :

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 ファイル内の 1 つの列を別の列に対してグラフ化しようとしています。

ここで何を誤解しましたか?他にどうすればこれを行うことができますか?

4

2 に答える 2

0

作成しようとしているオブジェクトが大きすぎるため、Python のメモリが不足しています。その理由は、データに非常に大きな文字列が含まれているためです (これは前の質問でわかりました)。

作成する配列dataには、単一のdtype. この dtype のサイズは、データ内の最長の文字列を保持するのに十分な大きさになるように選択されています。しかし、他のコンテンツに関係なく、データの各フィールドには同じ量のメモリが割り当てられます! このため、配列のメモリ内のサイズは、データ ファイルのサイズよりもはるかに大きくなる可能性があります。

解決策として、各列の dtype を指定できますが、実際に必要なデータのみをロードする方が簡単です。

data = sp.genfromtxt('data/train.tsv', 
                     delimiter ='\t', 
                     names=True, 
                     usecols='avglinksize','label'))
于 2013-10-28T22:49:01.167 に答える
0

を使用してロードできます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')

mPython コンソールで削除するdel mか、Python コンソールを閉じると、ファイルが保存されます。r+ファイルの作成後にモードを変更する必要があるかもしれません。

通常の配列であるかのように memmap 配列を操作できます。これにより、関心のある部分のみを取得できます。

于 2013-10-28T23:29:34.077 に答える