Bessere Möglichkeit, Speicher für Multiprozessing in Python freizugeben?

8

Ich habe dieses Problem jetzt seit einer Woche angepackt und es ist ziemlich frustrierend geworden, denn jedes Mal, wenn ich ein einfacheres, aber ähnlich großes Beispiel für das, was ich machen muss, umsetze, stellt sich heraus, dass Multiprozessing es verpuffen wird. Die Art und Weise, wie es mit Shared Memory umgeht, verblüfft mich, weil es so begrenzt ist, dass es ziemlich schnell nutzlos werden kann.

Also ist die grundlegende Beschreibung meines Problems, dass ich einen Prozess erstellen muss, der in einigen Parametern übergeben wird, um ein Bild zu öffnen und ungefähr 20K Patches der Größe 60x40 zu erstellen. Diese Patches werden jeweils in einer Liste 2 gespeichert und müssen an den Hauptthread zurückgegeben werden, um dann von zwei anderen gleichzeitigen Prozessen, die auf der GPU ausgeführt werden, erneut verarbeitet zu werden.

Der Prozess und der Workflow und all das, was meistens erledigt wird, was ich jetzt brauche ist, dass der Teil, der am einfachsten sein sollte, sich als der schwierigste herausstellt. Ich konnte nicht speichern und bekomme die Liste mit 20K Patches zurück zum Hauptthread.

Das erste Problem war, weil ich diese Patches als PIL-Bilder gespeichert habe. Ich habe dann herausgefunden, dass alle Daten, die zu einem Queue-Objekt hinzugefügt werden, gebeizt werden müssen. Das zweite Problem war, dass ich die Patches dann in ein Array von je 60x40 konvertiert und in einer Liste gespeichert habe. Und das geht jetzt immer noch nicht? Anscheinend haben Warteschlangen eine begrenzte Menge an Daten, die sie sonst speichern können, wenn Sie queue_obj.get () aufrufen, hängt das Programm.

Ich habe viele andere Dinge ausprobiert, und jede neue Sache, die ich versuche, funktioniert nicht, also würde ich gerne wissen, ob jemand andere Empfehlungen einer Bibliothek hat, die ich verwenden kann, um Objekte ohne all den Fuzz zu teilen?

Hier ist eine Beispielimplementierung der Art von was ich betrachte. Denken Sie daran, das funktioniert vollkommen in Ordnung, aber die vollständige Implementierung nicht. Und ich habe den Code, um Informationsnachrichten zu drucken, um zu sehen, dass die gespeicherten Daten die exakt gleiche Form und alles haben, aber aus irgendeinem Grund funktioniert es nicht. In der vollständigen Implementierung wird der unabhängige Prozess erfolgreich abgeschlossen, jedoch bei q.get () eingefroren.

%Vor%     
alfredox 05.11.2015, 01:57
quelle

2 Antworten

6

Warteschlange dient zur Kommunikation zwischen Prozessen. In Ihrem Fall haben Sie nicht wirklich diese Art von Kommunikation. Sie können den Prozess einfach zurückgeben lassen und die Methode .get() verwenden, um sie zu sammeln. (Denken Sie daran, if __name__ == "main": hinzuzufügen, siehe Programmierrichtlinie )

%Vor%

Nun, nach der ersten Antwort dieses Beitrags , Multiprozessing nur passierbare Objekte übergeben. Das Beizen ist im Multiprocessing wahrscheinlich unvermeidlich, da Prozesse keinen Speicher teilen. Sie leben einfach nicht im selben Universum. (Sie erben Speicher, wenn sie zum ersten Mal erzeugt werden, aber sie können ihr eigenes Universum nicht erreichen). Das PIL-Bildobjekt selbst ist nicht pickbar. Sie können es einfügbar machen, indem Sie nur die darin gespeicherten Bilddaten extrahieren, wie in diesem Beitrag vorgeschlagen.

Da Ihr Problem hauptsächlich I / O-gebunden ist, können Sie auch Multi-Threading versuchen. Es könnte für Ihren Zweck noch schneller sein. Threads teilen alles, so dass kein Beizen erforderlich ist. Wenn Sie Python 3 verwenden, ist ThreadPoolExecutor ein wunderbares Werkzeug. Für Python 2 können Sie ThreadPool verwenden. Um eine höhere Effizienz zu erreichen, müssen Sie die Vorgehensweise neu anordnen, den Prozess aufteilen und verschiedene Threads ausführen lassen.

%Vor%     
user3667217 05.11.2015, 17:46
quelle
1
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ tag123multithreading ___ Multi-Threading ist die Fähigkeit eines Computers oder eines Programms, Arbeit gleichzeitig oder asynchron auszuführen, indem mehrere gleichzeitige Ausführungsströme (im Allgemeinen als Threads bezeichnet) verwendet werden. ___ qstntxt ___

Ich habe dieses Problem jetzt seit einer Woche angepackt und es ist ziemlich frustrierend geworden, denn jedes Mal, wenn ich ein einfacheres, aber ähnlich großes Beispiel für das, was ich machen muss, umsetze, stellt sich heraus, dass Multiprozessing es verpuffen wird. Die Art und Weise, wie es mit Shared Memory umgeht, verblüfft mich, weil es so begrenzt ist, dass es ziemlich schnell nutzlos werden kann.

Also ist die grundlegende Beschreibung meines Problems, dass ich einen Prozess erstellen muss, der in einigen Parametern übergeben wird, um ein Bild zu öffnen und ungefähr 20K Patches der Größe 60x40 zu erstellen. Diese Patches werden jeweils in einer Liste 2 gespeichert und müssen an den Hauptthread zurückgegeben werden, um dann von zwei anderen gleichzeitigen Prozessen, die auf der GPU ausgeführt werden, erneut verarbeitet zu werden.

Der Prozess und der Workflow und all das, was meistens erledigt wird, was ich jetzt brauche ist, dass der Teil, der am einfachsten sein sollte, sich als der schwierigste herausstellt. Ich konnte nicht speichern und bekomme die Liste mit 20K Patches zurück zum Hauptthread.

Das erste Problem war, weil ich diese Patches als PIL-Bilder gespeichert habe. Ich habe dann herausgefunden, dass alle Daten, die zu einem Queue-Objekt hinzugefügt werden, gebeizt werden müssen. Das zweite Problem war, dass ich die Patches dann in ein Array von je 60x40 konvertiert und in einer Liste gespeichert habe. Und das geht jetzt immer noch nicht? Anscheinend haben Warteschlangen eine begrenzte Menge an Daten, die sie sonst speichern können, wenn Sie queue_obj.get () aufrufen, hängt das Programm.

Ich habe viele andere Dinge ausprobiert, und jede neue Sache, die ich versuche, funktioniert nicht, also würde ich gerne wissen, ob jemand andere Empfehlungen einer Bibliothek hat, die ich verwenden kann, um Objekte ohne all den Fuzz zu teilen?

Hier ist eine Beispielimplementierung der Art von was ich betrachte. Denken Sie daran, das funktioniert vollkommen in Ordnung, aber die vollständige Implementierung nicht. Und ich habe den Code, um Informationsnachrichten zu drucken, um zu sehen, dass die gespeicherten Daten die exakt gleiche Form und alles haben, aber aus irgendeinem Grund funktioniert es nicht. In der vollständigen Implementierung wird der unabhängige Prozess erfolgreich abgeschlossen, jedoch bei q.get () eingefroren.

%Vor%     
___ tag123sharedmemory ___ Speicher, auf den mehrere Programme gleichzeitig zugreifen können ___ tag123pythonmultiprocessing ___ Multiprocessing ist ein Paket, das das Erstellen von Launch-Prozessen mit einer API unterstützt, die dem Threading-Modul in der Python-Programmiersprache ähnelt. ___ tag123multiprocessing ___ Multiprocessing ist die Verwendung von zwei oder mehr zentralen Verarbeitungseinheiten (CPUs) innerhalb eines einzelnen Computersystems ___ answer33551393 ___

Warteschlange dient zur Kommunikation zwischen Prozessen. In Ihrem Fall haben Sie nicht wirklich diese Art von Kommunikation. Sie können den Prozess einfach zurückgeben lassen und die Methode Queue verwenden, um sie zu sammeln. (Denken Sie daran, qn1.cancel_join_thread() hinzuzufügen, siehe Programmierrichtlinie )

%Vor%

Nun, nach der ersten Antwort dieses Beitrags , Multiprozessing nur passierbare Objekte übergeben. Das Beizen ist im Multiprocessing wahrscheinlich unvermeidlich, da Prozesse keinen Speicher teilen. Sie leben einfach nicht im selben Universum. (Sie erben Speicher, wenn sie zum ersten Mal erzeugt werden, aber sie können ihr eigenes Universum nicht erreichen). Das PIL-Bildobjekt selbst ist nicht pickbar. Sie können es einfügbar machen, indem Sie nur die darin gespeicherten Bilddaten extrahieren, wie in diesem Beitrag vorgeschlagen.

Da Ihr Problem hauptsächlich I / O-gebunden ist, können Sie auch Multi-Threading versuchen. Es könnte für Ihren Zweck noch schneller sein. Threads teilen alles, so dass kein Beizen erforderlich ist. Wenn Sie Python 3 verwenden, ist put ein wunderbares Werkzeug. Für Python 2 können Sie ThreadPool verwenden. Um eine höhere Effizienz zu erreichen, müssen Sie die Vorgehensweise neu anordnen, den Prozess aufteilen und verschiedene Threads ausführen lassen.

%Vor%     
___ qstnhdr ___ Bessere Möglichkeit, Speicher für Multiprozessing in Python freizugeben? ___
ShadowRanger 05.11.2015 21:34
quelle