0

hdf5 ファイルに含まれるデータセットに単純な関数を適用したいと考えています。これに似たコードを使用しています

import h5py
data_sums = []

with h5py.File(input_file, "r") as f:
    for (name, data) in f["group"].iteritems():
        print name
        # data_sums.append(data.sum(1))
        data[()]  # My goal is similar to the line above but this line is enough
                  # to replicate the problem

最初は非常に高速で、ある程度再現可能なデータセットが一定数になると、劇的に遅くなります。最後の行をコメントすると、ほぼ瞬時に終了します。データが保存されている (ここではリストに追加されている) かどうかは問題ではありません: 同様の効果として data[:100] のようなもの。パフォーマンスが低下する前に処理できるデータセットの数は、各反復でアクセスされる部分のサイズに依存します。小さなチャンクを繰り返し処理しても問題は解決しません。

メモリスペースがいっぱいになり、いっぱいになるとプロセスが遅くなると思いますが、その理由はわかりません。

このパフォーマンスの問題を回避するにはどうすればよいですか?

ubuntu 10.04でpython 2.6.5を実行しています。

編集: ループの 2 行目がコメント解除されている場合、次のコードは遅くなりません。それがないと遅くなります

f = h5py.File(path to file, "r")
list_name = f["data"].keys()
f.close()

import numpy as np

for name in list_name:
    f = h5py.File(d.storage_path, "r")
    # name = list_name[0] # with this line the issue vanishes.
    data = f["data"][name]
    tag = get_tag(name)
    data[:, 1].sum()
    print "."

    f.close()

編集:多次元データセットの最初の次元へのアクセスは問題なく実行されるように見えることがわかりました。この問題は、より高い次元が含まれる場合に発生します。

4

1 に答える 1

1

プラットホーム?

Windows 64 ビット、python 2.6.6 では、小さなチャンクで割り当てた場合に 2GB のバリアを越えるときに奇妙な問題が発生することがあります (私はそう思います)。

次のようなスクリプトで確認できます。

ix = []
for i in xrange(20000000):
    if i % 100000 == 0:
        print i
    ix.append('*' * 1000)

しばらくは非常に高速に実行され、その後突然速度が低下することがわかります。

ただし、より大きなブロックで実行する場合:

ix = []
for i in xrange(20000):
    if i % 100000 == 0:
        print i
    ix.append('*' * 1000000)

問題はないようです(ただし、メモリの量によってはメモリが不足します-ここでは8GB)。

さらに奇妙なことに、大きなブロックを使用してメモリを消費し、メモリをクリアして (再び ix=[] 、使用中のメモリがほとんどない状態に戻ります)、小さなブロックのテストを再実行すると、もう遅くはありません。 .

pyreadline バージョンへの依存があったと思います - 2.0-dev1 は、この種の問題に大いに役立ちました。しかし、あまり覚えていません。今試してみたところ、この問題はもう実際には見られません.どちらも4.8GB前後で大幅に遅くなります。これは、実行している他のすべてのもので、物理メモリの限界に達してスワッピングを開始する場所に関するものです.

于 2013-09-23T14:54:56.267 に答える