2016-03-30 11 views
0

78TB HDF5データセットを2dブロックパーティション方式で作成しようとしています。これは、書込み中のブロックが書かれていない行にまたがるときに非常に遅くなります。なぜなら、HDF5はディスクスペースを割り当てて、欠落しているエントリをゼロで埋めるためです。h5pyを使用して、早期割り当てと無しでhdf5データセットを作成する方法

代わりに、作成したデータセットのディスクスペースをh5pyに割り当てて、それを決して埋めることはできません。これは表16のthe HDF5 Dataset documentationのC APIで可能ですが、どのようにしてh5pyでこれを行うことができますか?

答えて

0

Quinceyが提案しました。あなたはその後、高レベルのDataSetオブジェクトに戻ってそれを変換FILL_TIME_NEVERプロパティを持つデータセットを作成するために、低レベルH5py APIを使用することができます。

# create the rows dataset using the low-level api so I can force it to not do zero-filling, then convert to a high level object 
spaceid = h5py.h5s.create_simple((numRows, numCols)) 
plist = h5py.h5p.create(h5py.h5p.DATASET_CREATE) 
plist.set_fill_time(h5py.h5d.FILL_TIME_NEVER) 
plist.set_chunk((rowchunk, colchunk)) 
datasetid = h5py.h5d.create(fout.id, "rows", h5py.h5t.NATIVE_DOUBLE, spaceid, plist) 
rows = h5py.Dataset(datasetid) 
0

書き込みパターンに一致するチャンクシェイプを指定してください。あなたは1024×1024のブロックに書き込みをしている場合たとえば、それは次のようになります。

import h5py 
import numpy as np 
f = h5py.File('mybigdset.h5', 'w') 
dset = f.create_dataset('dset', (78*1024*1024, 1024*1024), dtype='f4', chunks=(1024,1024)) 
arr = np.random.rand(1024,1024) 
dset[0:1024, 0:1024] = arr 
f.close() 

はありがたいことに、これはディスクの78TBを使用していなかった、ファイルサイズがちょうど4メガバイトでした。

+0

私は、ファイルが作成された行を忘れてしまった、これは直前になりますcreate_dataset呼び出し:f = h5py.File( 'mybigdset.h5'、 'w') –

+0

ok - これを追加しました。 –

+0

提案に感謝します。私はアクセスが行のブロックになるアプリケーションで使用するためにこのファイルを生成していますので、チャンクを使用したくありません。 – AatG

0

私はあなたがH5Pset_fill_time()ルーチンを使って "決して"満杯時間を設定したいと思っていますが、それを行うh5pyの方法は分かりません。

関連する問題