inkrementelle schreibt im HDF5 mit h5py
Ich habe eine Frage, wie am besten zu schreiben, im HDF5-Dateien mit python /h5py.
Habe ich Daten wie:
-----------------------------------------
| timepoint | voltage1 | voltage2 | ...
-----------------------------------------
| 178 | 10 | 12 | ...
-----------------------------------------
| 179 | 12 | 11 | ...
-----------------------------------------
| 185 | 9 | 12 | ...
-----------------------------------------
| 187 | 15 | 12 | ...
...
mit über 10^4 Spalten und etwa 10^7 Zeilen. (Das ist etwa 10^11 (100 Milliarden) Elemente, oder ~100 GB, die mit 1-byte ints).
Mit diesen Daten typische Anwendung ist ziemlich write once, read many times, und die typische " read-Fall wäre zu packen, Spalte 1 und in einer weiteren Spalte (sagen 254), laden die beiden Spalten in den Speicher, und einige Phantasie-Statistiken.
Ich denke, eine gute im HDF5-Struktur wäre also um jede Spalte in der Tabelle oben werden im HDF5-Gruppe, die 10^4 Gruppen. So müssen wir uns nicht alle Lesen die Daten in den Speicher, ja? Die im HDF5-Struktur ist noch nicht definiert, aber so kann es alles sein.
Nun die Frage:
Ich erhalte die Daten von ~10^4 Zeilen gleichzeitig (und nicht genau die gleiche Anzahl von Zeilen jedes mal), und schreiben müssen, das es schrittweise zu den im HDF5-Datei. Wie Schreibe ich diese Datei?
Ich überlege, python und h5py, konnte aber ein weiteres tool, wenn empfohlen. Ist die Segmentierung der Weg zu gehen, mit z.B.
dset = f.create_dataset("voltage284", (100000,), maxshape=(None,), dtype='i8', chunks=(10000,))
dann, wenn ein anderer block von 10^4 Zeilen eintrifft, ersetzen Sie das dataset?
Oder ist es besser, einfach speichern Sie für jeden block von 10^4 Zeilen als separates dataset? Oder muss ich wirklich wissen müssen, um die endgültige Anzahl der Zeilen? (Das wird schwierig zu bekommen, aber vielleicht möglich).
Kann ich Kaution auf im HDF5, wenn es nicht das richtige tool für den job, obwohl ich denke, sobald die peinliche schreibt, sind getan, es wird wunderbar sein.
InformationsquelleAutor user116293 | 2014-09-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Pro das FAQ, Sie können erweitern Sie das dataset mit
dset.resize
. Zum Beispiel,i8
sind für 8-byte-Ganzzahlen. Sie können die byte-Größe mitnp.dtype('i8').itemsize
. Wenn Sie wollen 1-byte-Ganzzahlen, die Verwendungnp.int8
(aka'i1'
).InformationsquelleAutor unutbu
Als @unutbu darauf hingewiesen,
dset.resize
ist eine ausgezeichnete Wahl. Es kann arbeiten, während zu schauenpandas
und seine Im HDF5 Unterstützung, die nützlich sein können bei Ihrem workflow. Es klingt wie im HDF5 ist eine angemessene Wahl, da Ihre Bedürfnisse, aber es ist möglich, dass Ihr problem vielleicht besser ausgedrückt mit Hilfe einer zusätzlichen Schicht auf der Oberseite.Eine große Sache zu prüfen, ist die Ausrichtung der Daten. Wenn Sie in Erster Linie daran interessiert, liest, und Sie sind in Erster Linie das abrufen von Daten durch die Spalte, dann es klingt wie Sie vielleicht möchten zu transponieren der Daten, so dass Sie das liest kann geschehen durch Zeile wie im HDF5-Filialen in row-major-Reihenfolge.
InformationsquelleAutor daniel