Wie schreibe ich Daten aus einer einzelnen hdf5-Datei sicher in mehrere Dateien parallel in Python?

8

Ich versuche, meine Daten (von einer einzigen Datei im hdf5-Format) in mehrere Dateien zu schreiben, und es funktioniert gut, wenn die Aufgabe seriell ausgeführt wird. Jetzt möchte ich die Effizienz verbessern und den Code mit dem multiprocessing Modul modifizieren, aber die Ausgabe geht manchmal schief. Hier ist eine vereinfachte Version meines Codes.

%Vor%

und die Struktur von data_write_func() ist:

%Vor%

Wenn ich N=1 einstelle, funktioniert es gut. Aber wenn ich N=2 oder N=4 einstelle, wird das Ergebnis manchmal durcheinander gebracht (nicht jedes Mal!). z.B. In data_part_1 erwarte ich, dass die Ausgabe wie folgt aussieht:

%Vor%

Aber manchmal was ich bekomme ist

%Vor%

Manchmal bekomme ich

%Vor%

Ich bin neu im Multiprocessing-Modul und finde es schwierig. Schätze es wenn irgendwelche Vorschläge!

    
JenkinsY 02.01.2018, 08:26
quelle

3 Antworten

6

Nachdem Sie fout.write und mydata=... korrigiert haben, wie Andriy vorgeschlagen hat, funktioniert Ihr Programm wie vorgesehen, da jeder Prozess in seine eigene Datei schreibt. Es gibt keine Möglichkeit, dass sich die Prozesse miteinander vermischen.

Was Sie probaby tun wollten, ist die Verwendung von multiprocessing.map() , wodurch Ihre iterable für Sie reduziert wird (Sie müssen also nicht die block_size -Dinge machen), und es garantiert, dass die Ergebnisse sind in der Reihenfolge gemacht. Ich habe Ihren Code überarbeitet, um Multiprocessing-Map zu verwenden:

%Vor%

Bitte beachten Sie:

  • Ich werde aus dem Prozess selbst genommen, es ist entweder 1 oder 2
  • wie jetzt data_write_func für jede Zeile aufgerufen wird, muss die Dateiöffnung im übergeordneten Prozess erfolgen. Außerdem: Sie müssen die Datei close() nicht manuell ausführen, das OS erledigt das für Sie beim Beenden Ihres Python-Programms.

Nun, am Ende sollten Sie die gesamte Ausgabe in eine -Datei haben, nicht in separaten Dateien. Wenn Ihre Ausgabezeile unter Linux unter 4096 Byte liegt (oder unter OSX unter 512 Byte, lesen Sie für andere Betriebssysteme hier ) Sie können sogar nur eine Datei öffnen (im Append-Modus) und jeden Prozess einfach in diese eine Datei schreiben lassen, da unterhalb dieser Größen garantiert ist, dass sie von Unix atomar sind.

Aktualisieren :

  

"Was ist, wenn die Daten in der Datei hdf5 als Datensatz gespeichert sind?"

Laut hdf5 doc funktioniert das seit Version 2.2.0 out of the box:

  

Parallel HDF5 ist eine Konfiguration der HDF5-Bibliothek, mit der Sie geöffnete Dateien über mehrere parallele Prozesse hinweg freigeben können. Es verwendet den MPI (Message Passing Interface) -Standard für die Interprozesskommunikation

Also, wenn Sie das in Ihrem Code tun:

%Vor%

Dann können Sie einfach innerhalb Ihres Prozesses auf dset zugreifen und ohne zusätzliche Maßnahmen lesen / schreiben. Siehe auch dieses Beispiel von h5py, das Multiprozessing verwendet

    
hansaplast 02.01.2018 14:28
quelle
2

Das Problem konnte nicht repliziert werden. Hier ist mein vollständiger Code:

%Vor%

Beispielausgabe von data_part_0 :

%Vor%     
Andriy Makukha 02.01.2018 09:29
quelle
-2

Multiprocessing kann die Reihenfolge der Codeausführung zwischen verschiedenen Threads nicht garantieren, es ist durchaus sinnvoll, dass zwei Prozesse in umgekehrter Reihenfolge ihrer Erstellungsreihenfolge ausgeführt werden (zumindest auf Windows und Mainstream-Linux)

Normalerweise benötigen Sie bei der Verwendung von Parallelisierung Worker-Threads, um die Daten zu generieren dann die Daten in einer threadsicheren Datenstruktur zu aggregieren und in Datei zu speichern, aber Sie schreiben hier vermutlich in eine Datei auf einer Festplatte, haben Sie Grund zu der Annahme, dass Sie durch die Verwendung mehrerer Threads zusätzliche Leistung erhalten?

    
AntiMatterDynamite 02.01.2018 13:03
quelle

Tags und Links