Mam 60 GB SciPy Array (Matrix), które muszę udostępniać między 5+ multiprocessing
Process
obiektami. Widziałem numpy-sharedmem i przeczytałem tę dyskusję na liście SciPy. Wydaje się, że są dwa podejścia - numpy-sharedmem
i używając a multiprocessing.RawArray()
oraz mapując NumPy dtype
s na ctype
s. numpy-sharedmem
Wydaje się , że jest to właściwy sposób, ale nie widziałem jeszcze dobrego przykładu referencyjnego. Nie potrzebuję żadnych blokad, ponieważ tablica (właściwie macierz) będzie tylko do odczytu. Teraz, ze względu na jego rozmiar, chciałbym uniknąć kopii. To brzmi jak poprawna metoda jest stworzenie tylko kopię tablicy jako sharedmem
tablicy, a następnie przekazać je do Process
obiektów? Kilka szczegółowych pytań:
Jaki jest najlepszy sposób przekazania uchwytów pamięci współdzielonej do podrzędnych
Process()
? Czy potrzebuję kolejki tylko do przekazywania jednej tablicy? Czy fajka byłaby lepsza? Czy mogę po prostu przekazać to jako argument doProcess()
init podklasy (gdzie zakładam, że jest wytrawiony)?W dyskusji, którą połączyłem powyżej, jest wzmianka o
numpy-sharedmem
braku bezpieczeństwa 64-bitowego? Zdecydowanie używam niektórych struktur, które nie są 32-bitowe adresowalne.Czy są jakieś kompromisy w tym
RawArray()
podejściu? Wolniej, buggier?Czy potrzebuję mapowania ctype-to-dtype dla metody numpy-sharedmem?
Czy ktoś ma przykład, jak jakiś kod OpenSource to robi? Jestem bardzo praktyczny i ciężko jest mi to udać bez żadnego dobrego przykładu.
Jeśli mogę podać dodatkowe informacje, które pomogą wyjaśnić to innym, skomentuj, a dodam. Dzięki!
To musi działać na Ubuntu Linux i może Mac OS, ale przenośność nie jest wielkim problemem.
multiprocessing
się wykonania kopii całości dla każdego procesu.