h5py: Korrekte Methode zum Trennen von Array-Datasets

8

Ich bin ein bisschen verwirrt hier:

Soweit ich es verstanden habe, liest die .value -Methode von h5py ein ganzes Dataset und legt es in ein Array ab, was langsam und entmutigend ist (und normalerweise durch [()] ersetzt werden sollte. Der richtige Weg ist die Verwendung von numpy- esque schneiden.

Allerdings bekomme ich irritierende Ergebnisse (mit h5py 2.2.1):

%Vor%

Ich nehme an, dass meine Datenmenge so klein ist, dass .value die Leistung nicht signifikant beeinträchtigt, aber wie kann die erste Option so langsam sein? Was ist die bevorzugte Version hier?

Danke!

UPDATE Es scheint, dass ich nicht klar genug war, sorry. Ich weiß, dass .value das gesamte Dataset in den Speicher kopiert, während Slicing nur den entsprechenden Subpart abruft. Ich frage mich, warum das Schneiden in eine Datei langsamer ist, als das gesamte Array zu kopieren und dann in den Speicher zu schneiden. Ich dachte immer, dass hdf5 / h5py speziell implementiert wurde, so dass Teilabschnitte immer am schnellsten sind.

    
JiaYow 13.02.2014, 21:44
quelle

3 Antworten

15

Für schnelles Slicen mit h5py bleiben Sie bei der Slice-Notation "plain-vanilla":

%Vor%

oder zB jedes andere Element lesen:

%Vor%

Einfaches Slicen (Slice-Objekte und einzelne Integer-Indizes) sollte sehr schnell sein, da es direkt in HDF5-Hyperslab-Selektionen übersetzt wird.

Der Ausdruck file['test'][range(300000)] ruft h5pys Version von "fancy indexing" auf, nämlich die Indizierung über eine explizite Liste von Indizes. In HDF5 gibt es keine native Möglichkeit dies zu tun, daher implementiert h5py eine (langsamere) Methode in Python, die leider eine miserable Performance hat, wenn die Listen & gt; 1000 Elemente. Gleiches gilt für file['test'][np.arange(300000)] , das auf die gleiche Weise interpretiert wird.

Siehe auch:

[1] Ссылка

[2] Ссылка

    
Andrew Collette 14.02.2014, 22:24
quelle
2

Basierend auf dem Titel Ihres Beitrags besteht die "richtige" Methode zum Trennen von Array-Datasets in der Verwendung der integrierten Slice-Notation

Alle Ihre Antworten wären gleichwertig Datei ["Test"] [:]

[:] wählt alle Elemente im Array aus

Weitere Informationen zur Slicing-Notation finden Sie hier, Ссылка

Ich benutze hdf5 + python oft, ich musste nie die .value-Methoden verwenden. Wenn Sie auf ein Dataset in einem Array wie z myarr = Datei ["Test"]

python kopiert das Dataset im hdf5 bereits für Sie in ein Array.

    
abnowack 13.02.2014 22:49
quelle
2

Die Methode .value kopiert die Daten als numpliges Array in den Speicher. Versuchen Sie, type(file["test"]) mit type(file["test"].value) zu vergleichen: Ersteres sollte ein HDF5-Datensatz sein, letzteres ein numpliges Array.

Ich kenne die h5py- oder HDF5-Interna nicht genug, um Ihnen genau zu sagen, warum bestimmte Dataset-Operationen langsam sind. aber der Grund, warum diese beiden sind anders ist, dass in einem Fall Sie ein numpy Array im Speicher schneiden, und in der anderen einen HDF5-Datensatz von Festplatte schneiden.

    
Channing Moore 14.02.2014 01:42
quelle

Tags und Links