2016-03-30 11 views
0

Ich versuche, erstellen Sie eine 78 TB HDF5-Datensatz durch Füllen in einer 2D-Block-Partition Weise. Das ist sehr langsam, wenn der Block, den ich schreibe, Zeilen umspannt, an die noch nie geschrieben wurde, weil HDF5 hineingeht und den Speicherplatz reserviert und die fehlenden Einträge mit Null füllt.Wie hdf5-Dataset mit frühen Zuordnung und keine Füllung mit h5py erstellen

Stattdessen möchte ich, dass h5py den Speicherplatz für mein Dataset zuweist, sobald es erstellt wurde, und es nie füllen. Dies ist mit der CAPI gemäß Tabelle 16 in the HDF5 Dataset documentation möglich, aber wie kann ich dies mit h5py tun, vorzugsweise mit der High-Level-Schnittstelle?

Antwort

0

Wie Quincey vorgeschlagen. Sie können die Low-Level-H5py API verwenden, um die Datenmenge mit der FILL_TIME_NEVER Eigenschaft erstellen es dann zu einem High-Level-Dataset-Objekt konvertieren zurück:

# 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

Versuchen Sie, eine Chunk-Form anzugeben, die Ihrem Schreibmuster entspricht. Wenn Sie zum Beispiel in Blöcken von 1024x1024 schreiben, es würde wie folgt aussehen:

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() 

Zum Glück nicht 78TB Festplatten verwendet hat, war die Dateigröße nur 4 MB.

+0

ich die Zeile vergessen habe, in dem die Datei erstellt wurde, würde dies kurz vor seinem der create_dataset Aufruf: f = h5py.File ('mybigdset.h5', 'w') –

+0

ok - hinzugefügt. –

+0

danke für den Vorschlag. Ich erzeuge diese Datei für die Verwendung in einer Anwendung, in der der Zugriff in Blöcken von Zeilen erfolgt, sodass ich kein Chunking verwenden möchte. – AatG

0

Ich glaube, dass Sie die Füllzeit mit der Routine H5Pset_fill_time() auf "nie" einstellen möchten, aber ich weiß nicht, wie ich das machen soll.