2017-09-21 2 views
0

Ich habe einen relativ großen Datensatz (ca. 8GB), und lesen Sie es in einem jupyter Notebook mit h5py.Speichern Sie nur 'Spalte' Daten in h5py ohne Laden in der gesamten Datei

Die Form des Datasets endet etwa (50000000, 384). Mein idealer Datensatz hätte dies transponiert, so dass ich jede 'Spalte' im Datensatz betrachten kann. Die einzige Möglichkeit, mit der ich jede einzelne Spalte erreichen konnte, ist entweder die Indexierung für jede Spalte (was sehr langsam und CPU-intensiv ist, weil Zeile für Zeile in den 50000000 Zeilen liegt) oder die h5-Daten in ein np.array und transponiere das - was auch sehr langsam und ineffektiv ist.

Zum Beispiel, ich habe eine h5-Datei:

chunk_file = h5py.File(chunk_fil_1, "r") 

chunk_file["ex_dat"] 

Ausgang:

HDF5 dataset "ex_dat": shape (50000000, 384) 

Wenn ich dies tun:

len(chunk_file["ex_dat"][0]) 

Ausgang:

384 

Hier möchte ich meine Ausgabe alle 50000000 Erscheinungen der '0th' Spalte sein.

Gibt es eine effiziente Möglichkeit, eine h5-Datei für 'Spalten' wie Daten zu indizieren, ohne jede Zeile zu lesen? Oder andere Alternativen zum Lesen dieses großen Datensatzes? Mein Endziel ist es, einzelne 'Spalten' in einem Pandas-Datenrahmen zu speichern.

+0

Was bedeutet 'arr = chunk_file [ "ex_dat"] [:, 0]' tun? Ich erwarte, dass es die 0-Spalte liest. Es ist langsamer als das Lesen von 'chunk_file [" ex_dat "] [0,:]', sollte aber immer noch sinnvoll sein. – hpaulj

+0

Möchten Sie ein 'Dataframe' mit 384 Spalten und den 50 ... Zeilen? Du wirst nur die ganze Sache gelesen haben. – hpaulj

Antwort

0

Also chunk_file['ex_dat'] ist ein numpy Array von Form (50000000, 384). Wenn Sie dies mit einer Ganzzahl indizieren, wird automatisch eine Zeile erfasst. Dies ist das erwartete Verhalten. Greift eine Spalte statt eine Reihe in einem Array numpy nur Index wie es

chunk_file['ex_dat'][:,0]

wo : sind „alle Zeilen“ und 0 ist die erste Spalte. Dies ist genau das gleiche wie die Matrix (array.T mit numpy) zur Umsetzung und nimmt dann die erste Reihe

chunk_file['ex_dat'].T[0]

+0

Richtig, das nimmt auch eine Menge meiner CPU in Anspruch - vermutlich weil es immer noch jede Zeile liest, während ich nur die Spalteninfo brauche. Es sei denn, ich interpretiere das falsch, und es ist eigentlich nur eine rechenintensive Tat, in jeder Zeile nach dem 0. Index zu suchen. – Pierpressure

+0

@Pierpressure, die Daten werden reihenweise in 'C'-Reihenfolge auf die Datei gelegt. Also ja, das Laden von '[:, 0]' bedeutet, dass es 384 Elemente für jeden Lesevorgang vorwärts springen lassen wird. Aber daran ist nicht zu denken, wie die Daten gespeichert werden. Wenn, wie der Name andeutet, die Daten "chunked" sind, dann können Sie Teilmengen der Zeilen lesen, um Speicher zu sparen. Überprüfen Sie die 'h5py' Dokumente. – hpaulj

Verwandte Themen