2011-01-07 6 views
3

私はSciPyを使っていくつかの統計を試みていますが、私の入力データセットは非常に大きく(〜1.9GB)、dbf形式です。 genfromtxtで配列を作成しようとすると、Numpyがエラーメッセージを返すほどファイルのサイズが大きくなります。 (私は3GBのRAMを持っていますが、win32を実行しています)。PyTablesまたはPyHDFを介して大きなテキストファイルをhdf5に読み込んでいますか?

すなわち:

Traceback (most recent call last): 

    File "<pyshell#5>", line 1, in <module> 
    ind_sum = numpy.genfromtxt(r"W:\RACER_Analyses\Terrestrial_Heterogeneity\IND_SUM.dbf", dtype = (int, int, int, float, float, int), names = True, usecols = (5)) 

File "C:\Python26\ArcGIS10.0\lib\site-packages\numpy\lib\npyio.py", line 1335, in genfromtxt 
    for (i, line) in enumerate(itertools.chain([first_line, ], fhd)): 

MemoryError 

他の記事から、私はPyTablesが提供するチャンクの配列が有用であることができることを見たが、私の問題は、最初の場所で、このデータに読んでいます。つまり、PyTablesやPyHDFは簡単にHDF5出力を作成することができますが、最初にデータを配列に取り込むにはどうすればよいでしょうか?例えば

import numpy, scipy, tables 

h5file = tables.openFile(r"W:\RACER_Analyses\Terrestrial_Heterogeneity\HET_IND_SUM2.h5", mode = "w", title = "Diversity Index Results") 

group = h5.createGroup("/", "IND_SUM", "Aggregated Index Values"`) 

、その後、私は、テーブルや配列を作成することができどちらかが、どのように私は元DBFデータを参照していますか?説明では?

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

答えて

4

データが大きすぎてメモリに収まらない場合は、メモリマップされたファイル(数字の配列のようですが、ディスクに保存されています - see docs here)を使って作業できますが、HDF5を使用して同様の結果を得ることができますアレイ上で実行する必要がある操作について説明します。明らかに、これは多くの操作を遅くしますが、これはまったく実行できない場合よりも優れています。

メモリ制限があるため、genfromtxtを使用できないと思います。代わりに、一度に1行ずつテキストファイルを繰り返し処理し、memmap/hdf5オブジェクト内の関連する位置にデータを書き込む必要があります。

「元のdbfデータを参照する」という意味は明確ではありませんか?明らかにどこかから来たファイル名を保存するだけで済みます。 HDF5オブジェクトには、この種のメタデータを格納するように設計された「属性」があります。

h5pyを使用すると、pytablesよりもhdf5ファイルにアクセスする方がはるかに簡単でクリーンな方法ですが、これは主に優先事項です。

+1

彼の入力ファイルが1.9GBの場合、彼は32ビットOSでそれをmmapすることができず、変換を行うために彼のpythonコードのためのアドレス空間を残しているかもしれません。 – user57368

+0

多くのありがとうございます。あなたが提案するメモリマップされたルートを使って行きます。 あなたの考えを分かち合うために時間を割いていただき、ありがとうございます。私はこれを稼働させるかどうかを知らせますが、まだ私が32ビットOSによって制限されているとはまだ心配しています。私はそれがどうなるか見ていきます。 もう一度ありがとうございます。 – jsnider

0

データがdbfファイル内にある場合は、my dbf packageを試してみることができます - アクセスするメモリ内のレコードのみを保持するので、必要なデータを引き出すレコードを循環させることができます。

import dbf 

table = dbf.Table(r"W:\RACER_Analyses\Terrestrial_Heterogeneity\IND_SUM.dbf") 

sums = [0, 0, 0, 0.0, 0.0, 0] 

for record in table: 
    for index in range(5): 
     sums[index] += record[index] 
関連する問題