2016-10-16 17 views
0

現在、100万行(可変長)のデータセットがあります。PythonでHDF5ファイルに大量の数値を書き込む

このデータをHDF5ファイルに書き込んで、後で使用することができます。 私はこれを動作させましたが、それはと信じられないほど遅いです。たとえ1000の値でさえ、HDF5ファイルに保存されるのに数分かかります。

私はSOやH5Pyのドキュメントを含むあらゆる場所を探していましたが、私のユースケースを説明するものは実際には見つかりませんでしたが、それはできます。

import h5py 
import numpy as np 

# I am using just random values here 
# I know I can use h5py broadcasts and I have seen it being used before. 
# But the issue I have is that I need to save around a million rows with each 10000 values 
# so I can't keep the entire array in memory. 
random_ints = np.random.random(size = (5000,10000)) 

# See http://stackoverflow.com/a/36902906/3991199 for "libver='latest'" 
with h5py.File('my.data.hdf5', "w", libver='latest') as f: 
    X = f.create_dataset("X", (5000,10000)) 
    for i1 in range(0, 5000): 
     for i2 in range(0, 10000): 
      X[i1,i2] = random_ints[i1,i2] 

     if i1 != 0 and i1 % 1000 == 0: 
      print "Done %d values..." % i1 

このデータはデータベースから来て、それが中に見られるように、事前に生成されたNP配列ではありません:私は、私が今やっている記述デモのソースコードをした以下

ソースコード。

このコードを実行すると、「Done 1000 values」が出力されるまでに時間がかかることがわかります。

私は、8GB RAM、Ubuntu 16.04 LTS、Intel Core M(Core i5と同様の性能を備えています)とSSDを搭載したラップトップを使用しています。

私はここでの放送について読んだ:http://docs.h5py.org/en/latest/high/dataset.html

私はこのようにそれを使用する場合:

for i1 in range(0, 5000): 
     X[i1,:] = random_ints[i1] 

それはすでに速く大きさを行く(行っては数秒です)。しかし、私は可変長データセット(カラムは可変長)で動作させる方法を知らない。私はHDF5のコンセプトの良いアイデアを今は持っていないと思うので、これがどのように行われるべきであるかの洞察力を少し得るのはいいです:)多くのありがとう!

+0

はい、ファイルへの個々の数値の反復と書き込み(またはメモリ内のnumpy配列への書き込み)は遅いです。スピードを上げるために、数千の大きなチャンクで作業したいと考えています。 – hpaulj

+0

@hpauljヘッドアップありがとう。あなたはそれについて詳述できますか?可変長をどうすれば処理できますか?私の本能は、最大のカウンターパートに列を塗りつぶして、私の質問に2番目のコードブロックを使用して数字を挿入するように指示します。それはこの問題に取り組むための良い方法ですか? –

+0

可変長を使用するデモコードには何も表示されません。あなたがやっていることは、要素ごとまたは行ごとに配列をファイルに書き込むことだけです。 – hpaulj

答えて

1

http://docs.h5py.org/en/latest/special.html

後、オープンH5ファイルfを使用して、私が試した:

vset[0]=np.random.randint(0,100,1000) # set just one element 
for i in range(100): # set all arrays of varying length 
    vset[i]=np.random.randint(0,100,i) 
vset[:]  # view the dataset 

またはオブジェクトの配列を作る:

dt = h5py.special_dtype(vlen=np.dtype('int32')) 
vset=f.create_dataset('vset', (100,), dtype=dt) 

を一つの要素のいずれかを設定

D=np.empty((100,),dtype=object) 
for i in range(100): # setting that in same way 
    D[i]=np.random.randint(0,100,i) 

vset[:]=D # write it to the file 

vset[:]=D[::-1] # or write it in reverse order 

最後の書き込みの部分:

In [587]: vset[-10:] 
Out[587]: 
array([array([52, 52, 46, 80, 5, 89, 6, 63, 21]), 
     array([38, 95, 51, 35, 66, 44, 29, 26]), 
     array([51, 96, 3, 64, 55, 31, 18]), 
     array([85, 96, 30, 82, 33, 45]), array([28, 37, 61, 57, 88]), 
     array([76, 65, 5, 29]), array([78, 29, 72]), array([77, 32]), 
     array([5]), array([], dtype=int32)], dtype=object) 

私は要素の部分を見ることができます。

In [593]: vset[3][:10] 
Out[593]: array([86, 26, 2, 79, 90, 67, 66, 5, 63, 68]) 

私は2次元配列として扱うことができない:vset[3,:10]。配列の配列です。

+0

これは私がこのすべてを理解できるようにしてくれてありがとう! –

関連する問題