何百もの天文画像ファイルの名前を含む配列(data_inputs
と呼ばれる)があります。その後、これらの画像が操作されます。私のコードは機能し、各画像の処理に数秒かかります。ただし、for
ループを介して配列を実行しているため、一度に1つのイメージしか実行できません。
for name in data_inputs:
sci=fits.open(name+'.fits')
#image is manipulated
イメージを先に変更する必要がある理由はないので、マシン上の4つのコアすべてを、各イメージが異なるイメージのforループを介して実行することは可能ですか?
multiprocessing
モジュールについて読んだことがありますが、私の場合にどのように実装するかわかりません。 multiprocessing
を機能させたいと思っています。最終的には10,000以上の画像でこれを実行する必要があるからです。
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
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()
代わりに
with Pool() as pool:
pool.map(fits.open, [name + '.fits' for name in datainput])