[PYTHON] Parallele Verarbeitung, die mehrere Argumente und die Anzahl der durch Mehrfachverarbeitung angegebenen Prozesse unterstützt [PDF speichern]

Hintergrund

Ich wollte ein Diagramm bestimmter Messdaten (csv) als PDF speichern. Wenn die Anzahl der Daten groß war (1000 Daten), dauerte es viel Zeit (ca. 8 Minuten), daher dachte ich darüber nach, sie zu verbessern.

Zweck

Ich möchte eine große Menge PDF mit hoher Geschwindigkeit speichern und verhindern, dass der PC während des Betriebs hängen bleibt.

Methode

Ich habe hauptsächlich folgendes mit Python gemacht.

  1. Alle Messdaten anzeigen (csv)
  2. Speichern Sie alle Messdaten in einem Array
  3. Lesen Sie alle Messbedingungsdaten
  4. Schleife mit allen Daten für jede Daten ← Beschleunigen Sie dies
  5. Empfangen Sie Messdaten und Messbedingungen (mehrere Argumente)
  6. Zeichnen Sie mit Matplot
  7. Als PDF speichern

Wie es ist

For-Schleife normalerweise in Python

Treading

Ich hatte Erfahrung in der Implementierung aus verschiedenen Gründen, also habe ich es versucht → Es scheint, dass sich die Geschwindigkeit nicht wesentlich ändert, da dieser Typ nur einen Kern verwenden kann. Trotzdem ist es überraschend, dass sich 4 Minuten ändern werden

multiprocessing.Process

Da die Funktion, die ich parallel verarbeiten möchte, mehrere Argumente hat, habe ich Process verwendet. Egal wie viel gg ich getan habe, ich wusste nicht, wie ich die Anzahl der Threads begrenzen sollte, also konnte ich es nicht implementieren. Aus diesem Grund wurden bei der Ausführung 1000 parallele Prozesse verarbeitet, wodurch mein PC unordentlich wurde.

multiprocessing.Pool

Es kann nur ein Argument haben, aber Sie können die Anzahl der Threads einfach angeben. Die folgenden Funktionen können für mehrere Argumente verwendet werden.

def wrapper(self, args):
	return self.f(*args)

Codierung

Die Codierung der Mehrfachverarbeitung ist in Ordnung, wenn Sie wie folgt vorgehen. Es ist die Mindestkonfiguration (es gibt keine Bedeutung für Parallelisierung), die nur das Codieren zeigt. Einzelheiten finden Sie in diesem Artikel. Ich habe die Parallelverarbeitung und Parallelverarbeitung von Python - Qiita gründlich untersucht

from multiprocessing import Process, Pool
import multiprocessing

def f(a, b): #Funktionen, die parallel verarbeitet werden sollen
    print(a, end=",") #Es ist nur eine Funktionsprüfung, also ist es einfach

def wrapper(args):  #Pool kann nur ein Argument annehmen, also beißen Sie es und erweitern Sie es.
    f(*args)

def main():
    #Parallelverarbeitung nach Prozess(Mehrere Argumente: o,Anzahl der angegebenen Prozesse: x)
    print('Process')
    p_list = []
    for i in range(20):
        p = Process(
            target=f,
            kwargs={'a': i, 'b': 0})
        p.start()  #Start
        p_list.append(p)

    for p in p_list:
        p.join()  #Warten Sie bis zum Ende

    #Parallele Verarbeitung durch Pool(Mehrere Argumente: x,Anzahl der angegebenen Prozesse: o)
    print('\nPool')
    p = Pool(multiprocessing.cpu_count())  #Parallelverarbeitung für die Anzahl der CPUs
    values = []

    for i in range(20):
        values.append((i, 0))
    p.map(wrapper, values)  #Erweitern Sie ein einzelnes Argument auf mehrere

if __name__ == "__main__":
    main()

Ergebnis

Process
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
Pool
6,0,8,14,2,10,16,3,11,17,5,13,18,1,9,15,4,12,19,7,

Fazit

Betriebszeit

Die Rangfolge ist wie folgt.

  1. Multiprocessing (Pool begrenzt die Anzahl der Threads auf die Anzahl der PC-Kerne) 1min 50sec
  2. Multiprocessing (unbegrenzte Anzahl von Threads) Ca. 4min 30sec
  3. threading 5min 41sec
  4. Keine Parallelisierung (automatische Parallelisierung durch Python? Nur) 9min 33sec

Erwägung

Vergleiche 1 und 2. In 1. wird der Prozess in der Reihenfolge von 8 Stück fortgesetzt.

In 2. wird die gesamte Verarbeitung (diesmal 1000 Verarbeitung) parallel ausgeführt.

――Ist 2. nicht schneller? Tatsächlich kann die CPU im Prinzip nicht parallel arbeiten. Was als Parallelverarbeitung erscheint, ändert eigentlich nur, was Sie tun. Zum Beispiel Parallelverarbeitung der Prozesse 1, 2 und 3 Prozess 1 (1 μs Ausführung) → Prozess 2 (1 μs Ausführung) → Prozess 3 (1 μs Ausführung) → Prozess 1 (1 μs Ausführung aus der Fortsetzung des vorherigen Schritts) → ... Es gibt nur vor, parallel zu sein. Deshalb Prozess 1 (bis zum Ende ausführen) → Prozess 2 (bis zum Ende ausführen) → Prozess 3 (bis zum Ende ausführen) Grundsätzlich ändert sich die Zeit jedoch nicht. (Manchmal) Da jedoch eine Parallelverarbeitung für die Anzahl der Kerne (Anzahl der CPUs) durchgeführt werden kann, ist die Verarbeitung bis dahin schneller.

»Warum bist du schneller geworden? Liegt es daran, dass Sie viel Speicher verwenden können? In 2. werden 1000 Prozesse ausgeführt, so dass der Speicher unübersichtlich wird. Ist das nicht so, weil es sich verbessert hat?

Recommended Posts

Parallele Verarbeitung, die mehrere Argumente und die Anzahl der durch Mehrfachverarbeitung angegebenen Prozesse unterstützt [PDF speichern]
Python-Parallelverarbeitung (Multiprocessing und Joblib)
Verwendung mehrerer Argumente bei der Parallelverarbeitung mithilfe der Mehrfachverarbeitung in Python