2015-03-23 2 views
8

Gibt es eine Möglichkeit, ein Array in einer hdf5-Datei zu speichern, die zu groß ist, um im Speicher geladen zu werden?Wie speichert man ein Array in der hdf5-Datei, die zu groß ist, um sie in den Speicher zu laden?

, wenn ich etwas zu tun wie dieses

f = h5py.File('test.hdf5','w') 
f['mydata'] = np.zeros(2**32) 

ich einen Speicherfehler.

+3

Werfen Sie einen Blick auf [hyperslabs] (http://docs.h5py.org/en/latest/high/dataset.html#chunked-storage). Es ist möglich, aber Sie sollten in "Chunks" schreiben, und machen Sie die hdf5-Datei chunkable. – Mathias711

+3

http://docs.h5py.org/en/latest/high/dataset.html#chunked-storage –

Antwort

6

Entsprechend der documentation können Sie create_dataset verwenden, um ein chunked Array zu erstellen, das in dem hdf5 gespeichert wird. Beispiel:

>>> import h5py 
>>> f = h5py.File('test.h5', 'w') 
>>> arr = f.create_dataset('mydata', (2**32,), chunks=True) 
>>> arr 
<HDF5 dataset "mydata": shape (4294967296,), type "<f4"> 

Schneidens des HDF5 dataset kehrt Numpy-Arrays.

>>> arr[:10] 
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32) 
>>> type(arr[:10]) 
numpy.array 

Sie können Werte wie für ein Numpy-Array festlegen.

Ich weiß nicht, ob dies der effizienteste Weg ist, aber Sie können über das gesamte Array in Chunks iterieren. Und zum Beispiel es auf Zufallswerte Einstellung:

>>> import numpy as np 
>>> for i in range(0, arr.size, arr.chunks[0]): 
     arr[i: i+arr.chunks[0]] = np.random.randn(arr.chunks[0]) 
>>> arr[:5] 
array([ 0.62833798, 0.03631227, 2.00691652, -0.16631022, 0.07727782], dtype=float32) 
+0

Was passiert, wenn die Datenmenge nicht vorher bekannt ist? Kann es im Append-Modus gemacht werden? – mrgloom

+0

@mrgloom Vielleicht passt das zu Ihren Bedürfnissen? https://stackoverflow.com/a/25656175/3635816 – RickardSjogren

Verwandte Themen