web-dev-qa-db-ja.com

forループのマルチプロセッシング?

何百もの天文画像ファイルの名前を含む配列(data_inputsと呼ばれる)があります。その後、これらの画像が操作されます。私のコードは機能し、各画像の処理に数秒かかります。ただし、forループを介して配列を実行しているため、一度に1つのイメージしか実行できません。

for name in data_inputs:
    sci=fits.open(name+'.fits')
    #image is manipulated

イメージを先に変更する必要がある理由はないので、マシン上の4つのコアすべてを、各イメージが異なるイメージのforループを介して実行することは可能ですか?

multiprocessingモジュールについて読んだことがありますが、私の場合にどのように実装するかわかりません。 multiprocessingを機能させたいと思っています。最終的には10,000以上の画像でこれを実行する必要があるからです。

52
ChrisFro

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
69
alko

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

代わりに

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