it-swarm.com.de

Multiprocessing einer for-Schleife?

Ich habe ein Array (genannt data_inputs), das die Namen von Hunderten von astronomischen Bilddateien enthält. Diese Bilder werden dann bearbeitet. Mein Code funktioniert und dauert einige Sekunden, um jedes Bild zu verarbeiten. Es kann jedoch jeweils nur ein Bild 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. Kann ich also alle 4 Cores auf meinem Computer verwenden, wobei jeder Core auf einem anderen Image durch die for-Schleife läuft?

Ich habe über das multiprocessing-Modul gelesen, aber ich bin mir nicht sicher, wie ich es in meinem Fall implementieren soll ..__ Ich bin sehr daran interessiert, multiprocessing zum Laufen zu bringen, weil ich es letztendlich mit 10.000 Bildern ausführen muss.

38
ChrisFro

Sie können einfach multiprocessing.Pool verwenden:

from multiprocessing import Pool

def process_image(name):
    sci=fits.open('{}.fits'.format(name))
    <process>

if __== '__main__':
    pool = Pool()                         # Create a multiprocessing Pool
    pool.map(process_image, data_inputs)  # process data_inputs iterable with pool
52
alko

Sie können multiprocessing.Pool verwenden:

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()
18
ixxo

Alternative

with Pool() as pool: 
    pool.map(fits.open, [name + '.fits' for name in datainput])
0
Spas