2013-09-10 18 views
8

私はPythonの初心者です。私は大きい配列、(43200, 4000)のような次元のaを持っています。私は将来の処理のために必要とするので、これを保存する必要があります。 np.savetxtで保存しようとすると、同じサイズの5つのファイルを処理する必要があるため、txtファイルが大きすぎてプログラムがメモリエラーに陥ります。巨大な配列を節約してメモリを減らす方法はありますか?大きな配列を保存する方法は、Pythonで少ないメモリを取るように?

ありがとうございました。

+3

'np.savetxt( 'file.npy.gz')'を試しましたか?保存には時間がかかりますが(圧縮のために)その後に読み込むこともできますが、ファイルのサイズを大幅に縮小する必要があります。 – wflynny

+0

@Billは返信してくれてありがとう、np.savetxt( 'file.npy.gz')で試してみましたが、ファイルサイズは小さくなりましたが、データを読み込めませんでした。 – user2766019

+0

ファイルを保存したのと同じファイル拡張子を使用してファイルをロードしてもよろしいですか? 'np.loadtxt( 'file.npy.gz')' – wflynny

答えて

3

PyTablesを使用して、データを格納する階層データフォーマット(HDF)ファイルを作成できます。これは、あなたがそれが中に保存されていたファイルにして作業しているオブジェクトをリンクし、いくつかの興味深い、メモリ内のオプションを提供し

ここでこれを実行する方法を示し、別のStackOverflowの質問です:あなたはに喜んでいる場合"How to store a NumPy multidimensional array in PyTables."

パンダデータフレームのオブジェクトとして使用するアレイと連携、あなたはまた、例えばPyTables/HDF5にパンダのインターフェースを使用することができます。このサイズのファイルで

import pandas 
import numpy as np 
a = np.ones((43200, 4000)) # Not recommended. 
x = pandas.HDFStore("some_file.hdf") 

x.append("a", pandas.DataFrame(a)) # <-- This will take a while. 
x.close() 

# Then later on... 
my_data = pandas.HDFStore("some_file.hdf") # might also take a while 
usable_a_copy = my_data["a"] # Be careful of the way changes to 
          # `usable_a_copy` affect the saved data. 

copy_as_nparray = usable_a_copy.values 

を、あなたのアプリケーションが並列アルゴリズムを用いて行うことができるかどうかを検討するかもしれません大規模な配列のサブセットにのみ適用される可能性があります先に進む前にすべてのアレイを消費する必要があります。

10

データをテキストファイルに保存するのは非常に効率が悪いです。 Numpyには、大きな配列の格納にはるかに適した保存コマンドsavesavez/savez_compressedが組み込まれています。

データをどのように使用するかによって、HDF5フォーマット(h5pyまたはpytables)も調べる必要があります。これにより、大量のデータセットをメモリにロードすることなく格納できます。

関連する問題