3

SciPy を使用していくつかの統計を試みていますが、入力データセットは非常に大きく (~1.9GB)、dbf 形式です。ファイルが十分に大きいため、genfromtxt で配列を作成しようとすると、Numpy がエラー メッセージを返します。(私は3GBのRAMを持っていますが、win32を実行しています)。

すなわち:

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

2 に答える 2

4

データが大きすぎてメモリに収まらない場合は、メモリ マップト ファイルを使用できます (numpy 配列に似ていますが、ディスクに保存されています。こちらのドキュメントを参照してください)。アレイで実行する必要がある操作。明らかに、これにより多くの操作が遅くなりますが、まったく実行できないよりはましです。

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

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

また、h5pyを使用すると、pytables よりも hdf5 ファイルにアクセスするためのはるかに簡単でクリーンな方法であることがわかりましたが、これは主に好みの問題です。

于 2011-01-07T22:30:43.137 に答える
0

データがdbfファイルにある場合は、私のdbfパッケージを試してみてください。アクセスされているレコードのみがメモリに保持されるため、必要なデータを引き出すレコードを循環できるはずです。

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]
于 2011-07-13T18:54:10.937 に答える