J'ai un tableau (appelé data_inputs
) contenant les noms de centaines de fichiers images d'astronomie. Ces images sont ensuite manipulées. Mon code fonctionne et prend quelques secondes pour traiter chaque image. Cependant, il ne peut créer qu'une image à la fois car j'exécute le tableau via une boucle for
:
for name in data_inputs:
sci=fits.open(name+'.fits')
#image is manipulated
Il n'y a aucune raison pour que je doive modifier une image avant une autre, est-il possible d'utiliser les 4 cœurs de ma machine, chacun passant par la boucle for sur une image différente?
J'ai lu des informations sur le module multiprocessing
mais je ne sais pas comment le mettre en œuvre dans mon cas ... Je tiens à faire en sorte que multiprocessing
fonctionne, car je devrai éventuellement l'exécuter sur plus de 10 000 images.
Vous pouvez simplement utiliser multiprocessing.Pool
:
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
Vous pouvez utiliser 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()
Alternativement
with Pool() as pool:
pool.map(fits.open, [name + '.fits' for name in datainput])