6

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(data)を使用してこのリストの長さを取得でき、401125を返します。リストインデックスを呼び出すことで、個々のレコードを取得することもできます。しかし、np.size(data)を呼び出してリストのサイズを取得しようとすると(numpyをnpとしてインポートしました)、次のスタックトレースが取得されます。

MemoryErrorトレースバック(最後の最後の呼び出し)in()----> 1 np.size(data)

C:\ Python27 \ lib \ site-packages \ numpy \ core \ fromnumeric.pyc in size(a、axis)2198 return a.size 2199ただし、AttributeError:-> 2200 return asarray(a).size 2201 else:2202 try:

C:\ Python27 \ lib \ site-packages \ numpy \ core \ neuro.pyc in asarray(a、dtype、order)233 234 "" "-> 235 return array(a、dtype、copy = False、order = order )236 237 def asanyarray(a、dtype = None、order = None):

MemoryError:

リストインデックスを使用してそのリストを複数の部分に分割したり、このリストをnumpy配列に変換したりすることさえできません。これと同じメモリエラーが発生します。

この種のビッグデータサンプルをどのように処理できますか。このような大きなデータセットを処理する他の方法はありますか?

私はWindows7Professionalでipythonノートブックを使用しています。

4

1 に答える 1

12

コメントで @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

fieldsまた、に基づいて定義することもできるheaderため、50 個の列名すべてを手動で入力する必要はありませんが、それぞれのデータ型を指定する必要があります。

于 2013-01-27T20:10:30.923 に答える