programing

루프에 대한 다중 처리?

megabox 2023. 8. 27. 09:03
반응형

루프에 대한 다중 처리?

배열이 있습니다(호출).data_inputs)는 수백 개의 천문학 이미지 파일의 이름을 포함합니다.그런 다음 이러한 이미지가 조작됩니다.내 코드는 작동하며 각 이미지를 처리하는 데 몇 초가 걸립니다.그러나 어레이를 실행하고 있기 때문에 한 번에 하나의 이미지만 수행할 수 있습니다.for루프:

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

이미지를 먼저 수정해야 할 이유가 없는데, 각 코어가 다른 이미지의 for 루프를 통해 실행되는 상태에서 기계의 4개 코어를 모두 사용할 수 있습니까?

나는 그것에 대해 읽었습니다.multiprocessing모듈이지만 제 경우에는 어떻게 구현해야 할지 잘 모르겠습니다.꼭 갖고 싶어요multiprocessing작업하려면 결국 10,000개 이상의 이미지에서 이 작업을 실행해야 하기 때문입니다.

다음을 사용할 수 있습니다.

from multiprocessing import Pool

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

if __name__ == '__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])

를 사용하는 것이 좋습니다.imap_unordered와 함께chunksize를 사용하는 경우에만for반복할 수 있도록 반복합니다.각 루프의 결과가 계산되는 즉시 반환됩니다.map는 모든 결과가 계산될 때까지 대기하므로 차단됩니다.

언급URL : https://stackoverflow.com/questions/20190668/multiprocessing-a-for-loop

반응형