나는 256x256x256
Numpy 배열을 가지고 있는데, 각 요소는 매트릭스이다. 이 행렬 각각에 대해 몇 가지 계산을 수행해야하며, 속도를 높이기 위해 multiprocessing
모듈을 사용하고 싶습니다. 원래의 배열 요소 [i,j,k]
에서 매트릭스의 결과가 새로운 배열의 요소 [i,j,k]
넣어해야 때문에 이러한 계산itertools와 다중 처리를 결합 하시겠습니까?
결과는 원래 같은 256x256x256
어레이에 저장되어야한다.
이렇게하려면 pseudo-ish 방식으로 [array[i,j,k], (i, j, k)]
으로 작성하여 "다중 처리"되는 함수에 전달할 수있는 목록을 만들고 싶습니다. matrices
은 원래 배열과 myfunc
에서 추출 된 모든 행렬의 목록은 계산을 수행하는 기능이다라고 가정 코드는 다음과 같이 다소 보일 것이다
import multiprocessing
import numpy as np
from itertools import izip
def myfunc(finput):
# Do some calculations...
...
# ... and return the result and the index:
return (result, finput[1])
# Make indices:
inds = np.rollaxis(np.indices((256, 256, 256)), 0, 4).reshape(-1, 3)
# Make function input from the matrices and the indices:
finput = izip(matrices, inds)
pool = multiprocessing.Pool()
async_results = np.asarray(pool.map_async(myfunc, finput).get(999999))
그러나 map_async
실제로이 만드는 것 같아 거대한 finput
-list first : CPU 사용량은 많지 않지만 메모리와 스왑은 몇 초 만에 완전히 소모됩니다. 이는 분명 내가 원하는 것이 아닙니다.
명시 적으로 먼저 만들 필요없이이 거대한 목록을 다중 처리 기능에 전달할 수있는 방법이 있습니까? 또는이 문제를 해결하는 다른 방법을 알고 있습니까?
감사합니다. :-)
'map_async()'에서'get()'을 사용하고 있기 때문에 * 비동기 * 연산을 원하지 않으므로 대신'Pool.map()'을 사용해야합니다. –
아마도이 문제를 제대로 이해하지 못했지만 imap 또는 imap_unordered를 고려 했습니까? –