11 Stimmen

Verkettung einer großen Anzahl von HDF5-Dateien

Ich habe etwa 500 HDF5-Dateien mit jeweils etwa 1,5 GB.

Jede der Dateien hat genau dieselbe Struktur, d. h. 7 zusammengesetzte (int,double,double) Datensätze und eine variable Anzahl von Stichproben.

Nun möchte ich alle diese Dateien verketten, indem ich jeden der Datensätze verkette, so dass ich am Ende eine einzige 750 GB große Datei mit meinen 7 Datensätzen habe.

Derzeit führe ich ein h5py-Skript aus, das:

  • erstellt eine HDF5-Datei mit den richtigen Datensätzen von unbegrenzter Größe
  • alle Dateien nacheinander öffnen
  • Prüfen Sie die Anzahl der Stichproben (da sie variabel ist).
  • die Größe der globalen Datei ändern
  • die Daten anhängen

Dies dauert natürlich viele Stunden, Hätten Sie einen Vorschlag, wie man das verbessern könnte?

Ich arbeite an einem Cluster, also könnte ich HDF5 parallel verwenden, aber ich bin nicht gut genug in C Programmierung etwas selbst zu implementieren, bräuchte ich ein bereits geschriebenes Tool.

0 Stimmen

Eine Möglichkeit ist die Zusammenlegung von Dateipaaren in Ihrem Cluster; reduzieren Sie das Problem auf 250 3-GB-Dateien, dann 125 6-GB-Dateien usw. Dies ist nur dann hilfreich, wenn die teilweise Zusammenführung von Dateien bei der späteren Zusammenführung der Ergebnisse eine gewisse Zeitersparnis bringt.

0 Stimmen

@sarnold Ich arbeite an hopper am NERSC, die theoretische I/O Geschwindigkeit beträgt 25 GB/s, auch das Dateisystem ist vollständig parallel und unterstützt MPI I/O.

0 Stimmen

Ich dachte, vielleicht 3 oder 4 Dateien auf einmal zu lesen und schreiben sie zurück alle zusammen, aber das beste wäre ein c-Dienstprogramm, das irgendwie mpi I/O ausnutzt.

9voto

Andrea Zonca Punkte 7747

Ich habe festgestellt, dass die meiste Zeit mit der Größenänderung der Datei verbracht wurde, da ich bei jedem Schritt die Größe änderte, also gehe ich jetzt zuerst durch alle meine Dateien und ermittle ihre Länge (sie ist variabel).

Dann erstelle ich die globale h5-Datei und setze die Gesamtlänge auf die Summe aller Dateien.

Erst danach fülle ich die h5-Datei mit den Daten aus allen kleinen Dateien.

Jetzt dauert es etwa 10 Sekunden für jede Datei, so dass es weniger als 2 Stunden dauern sollte, während es vorher viel länger dauerte.

1voto

ashley Punkte 1475

Ich weiß, dass die Beantwortung dieser Frage mir ein Necro-Abzeichen einbringt, aber in letzter Zeit hat sich die Lage für mich in diesem Bereich verbessert.

In Julia dauert dies nur wenige Sekunden.

  1. Erstellen Sie eine txt-Datei, in der alle hdf5-Dateipfade aufgelistet sind (wenn es viele sind, können Sie dies mit der Bash in einem Durchgang erledigen)
  2. Lesen Sie in einer Schleife jede Zeile der txt-Datei und verwenden Sie label$i = h5read(original_filepath$i, "/label")
  3. alle Etiketten zusammenfügen label = [label label$i]
  4. Dann schreiben Sie einfach: h5write(data_file_path, "/label", label)

Dasselbe gilt für Gruppen oder kompliziertere hdf5-Dateien.

1voto

user185160 Punkte 766

Ashleys Antwort hat bei mir gut funktioniert. Hier ist eine Umsetzung ihres Vorschlags in Julia:

Erstellen Sie eine Textdatei, die die zu verkettenden Dateien in der Bash auflistet:

ls -rt $somedirectory/$somerootfilename-*.hdf5 >> listofHDF5files.txt

Schreiben Sie ein Julia-Skript, um mehrere Dateien in eine Datei zu verketten:

# concatenate_HDF5.jl
using HDF5

inputfilepath=ARGS[1]
outputfilepath=ARGS[2]

f = open(inputfilepath)
firstit=true
data=[]
for line in eachline(f)
    r = strip(line, ['\n'])
    print(r,"\n")
    datai = h5read(r, "/data")
    if (firstit)
        data=datai
        firstit=false
    else
        data=cat(4,data, datai) #In this case concatenating on 4th dimension
    end
end
h5write(outputfilepath, "/data", data)

Führen Sie dann die obige Skriptdatei mit aus:

julia concatenate_HDF5.jl listofHDF5files.txt final_concatenated_HDF5.hdf5

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X