Ich habe ein Array (genannt data_inputs
), das die Namen von Hunderten von Astronomie-Bilddateien enthält. Diese Bilder werden dann manipuliert. Mein Code funktioniert und es dauert einige Sekunden, um jedes Bild zu verarbeiten. Es kann jedoch immer nur ein Bild gleichzeitig erstellt werden, da das Array durch eine for
Schleife ausgeführt wird:
for name in data_inputs:
sci=fits.open(name+'.fits')
#image is manipulated
Es gibt keinen Grund, warum ich ein Image vor einem anderen ändern muss. Ist es also möglich, alle 4 Kerne auf meinem Computer zu verwenden, wobei jeder Kern durch die for-Schleife auf einem anderen Image läuft?
Ich habe über das multiprocessing
Modul gelesen , bin mir aber nicht sicher, wie ich es in meinem Fall implementieren soll. Ich bin sehr daran interessiert, mich multiprocessing
an die Arbeit zu machen, weil ich dies irgendwann auf über 10.000 Bildern ausführen muss.
quelle
pool = Pool(os.cpu_count())
Dies ist eine allgemeinere Methode zur Verwendung von Multiprocessing.os.cpu_count()
wurde in Python 3.4 hinzugefügt. Für Python 2.x verwendenmultiprocessing.cpu_count()
.Pool()
ist das gleiche wiePool(os.cpu_count())
Pool()
ohne Wert für aufgerufen -processes
ist dasselbe wiePool(processes=cpu_count())
unabhängig davon, ob Sie Python 3 oder 2 verwendenPool()
. Daher empfiehlt es sich, in JEDER Version zu verwenden . docs.python.org/2/library/multiprocessing.htmlSie können verwenden
multiprocessing.Pool
:from multiprocessing import Pool class Engine(object): def __init__(self, parameters): self.parameters = parameters def __call__(self, filename): sci = fits.open(filename + '.fits') manipulated = manipulate_image(sci, self.parameters) return manipulated try: pool = Pool(8) # on 8 processors engine = Engine(my_parameters) data_outputs = pool.map(engine, data_inputs) finally: # To make sure processes are closed in the end, even if errors happen pool.close() pool.join()
quelle
data_inputs
ist eine iterable (wie in einem Standardmap
).pool.map(func, iterable[, chunksize])
. Wird dieses Objekt beim Übergeben eines Objekts von allen Prozessen gemeinsam genutzt? Könnte ich also alle Prozesse in dieselbe Listeself.list_
im Objekt schreiben lassen ?Alternative
with Pool() as pool: pool.map(fits.open, [name + '.fits' for name in datainput])
quelle
TypeError: 'Pool' object is not callable