Mam tablicę Numpy 256x256x256
, w której każdy element jest macierzą. Muszę wykonać kilka obliczeń na każdej z tych macierzy i chcę użyć modułu multiprocessing
, aby przyspieszyć działanie.Łączenie itertools i multiprocessing?
Wyniki tych obliczeń musi być przechowywana w tablicy 256x256x256
jak pierwotnego, tak że w wyniku osnowy w elemencie [i,j,k]
w oryginalnej matrycy musi być umieszczona w elemencie [i,j,k]
nowej macierzy.
Aby to zrobić, chcę utworzyć listę, która mogłaby być zapisana w pseudo-ish sposób jako [array[i,j,k], (i, j, k)]
i przekazać ją do funkcji, która ma być "wieloprocesowa". Zakładając, że matrices
znajduje się lista wszystkich matryc pochodzących z oryginalnej tablicy i myfunc
jest funkcja prowadzenia obliczeń, kod będzie wyglądał mniej więcej tak:
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))
Jednak wydaje się, że map_async
jest faktycznie tworzenia tego Ogromna finput
-lista pierwsza: Mój procesor nie robi wiele, ale pamięć i zamiana zostają całkowicie zużyte w ciągu kilku sekund, co oczywiście nie jest tym, czego chcę.
Czy istnieje sposób na przekazanie tej ogromnej listy do funkcji przetwarzania wieloprocesowego bez potrzeby jej jawnego tworzenia? Czy znasz inny sposób rozwiązania tego problemu?
Wielkie dzięki! :-)
Ponieważ używasz 'get()' na 'map_async()', prawdopodobnie nie potrzebujesz * operacji asynchronicznej * i zamiast tego użyj 'Pool.map()'. –
Może nie rozumiem tego problemu poprawnie, ale czy uważasz, że imap lub imap_unordered? –