2013-05-20 6 views
5

Mein Python-Code empfängt ein Byte-Array, das die Bytes der hdf5-Datei darstellt.Kann h5py eine Datei von einem Byte-Array im Speicher laden?

Ich möchte dieses Byte-Array zu einem In-Memory-H5py-Dateiobjekt lesen, ohne zuerst das Byte-Array auf die Festplatte zu schreiben. This page sagt, dass ich eine Memory-Mapped-Datei öffnen kann, aber es wäre eine neue, leere Datei. Ich möchte von Byte-Array zu In-Memory-Hdf5-Datei gehen, sie verwenden, verwerfen und nicht zu jeder Zeit auf die Festplatte schreiben.

Ist es möglich, dies mit h5py zu tun? (Oder mit hdf5 mit C, wenn das der einzige Weg)

+1

Ich versuche das Gleiche zu tun. Könnten Sie Code mit der Lösung zeigen, der gearbeitet hat? Vielen Dank! – konus

+0

Ich fand die Lösung und postete es hier: https://stackoverflow.com/questions/11588630/pass-hdf5-file-to-h5py-as-binary-blob-string/45900556#45900556 – SCGH

Antwort

-3

Sie könnten versuchen, Binary I/O zu verwenden, um ein File-Objekt zu erstellen und sie über h5py lesen:

f = io.BytesIO(YOUR_H5PY_STREAM) 
h = h5py.File(f,'r') 
+0

Danke, das sieht wie aus Ich brauche – mahonya

+0

Diese Lösung funktioniert nicht. Siehe Kommentar unten. –

+0

Können Sie Ihren Code teilen, in dem diese Lösung funktioniert? –

1

Ich würde auch wirklich in der Lage sein mögen Erstellen Sie ein h5py.File-Objekt aus Daten im Speicher wie ein vorhandenes Python-Dateiobjekt, aber ich sehe keinen Hinweis darauf, dass h5py.File ein Dateiobjekt als Argument akzeptiert.

>>> f = io.BytesIO(open('test.h5').read()) 
>>> h5py.File(f, 'r') 
AttributeError: '_io.BytesIO' object has no attribute 'encode' 

h5py.File (open ('test.h5 '), r') ergibt einen ähnlichen Fehler. Ich sehe auch keine Möglichkeit, eine neue memory-mapped hdf5-Datei zu öffnen und einen Byte-Stream darin zu "deponieren".

+0

Haben Sie eine Lösung dafür gefunden? – konus

+1

Keine Lösung gefunden. Ich habe versucht, hd5-Dateien aus einem tar.gz-Archiv ohne zusätzliche Festplatten-I/O zu laden, aber am Ende eine temporäre Datei zu schreiben. Sie könnten in der Lage sein, dies mit einer Unix-FIFO-Datei und Threads/Fork zu umgehen, aber ich habe das nicht versucht. – lindyblackburn