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.
Ich möchte eine große Menge PDF mit hoher Geschwindigkeit speichern und verhindern, dass der PC während des Betriebs hängen bleibt.
Ich habe hauptsächlich folgendes mit Python gemacht.
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)
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,
Die Rangfolge ist wie folgt.
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