Mam 60 GB SciPy Array (Matrix), które muszę udostępniać między 5+ multiprocessing Processobiektami. Widziałem numpy-sharedmem i przeczytałem tę dyskusję na liście SciPy. Wydaje się, że są dwa podejścia - numpy-sharedmemi używając a multiprocessing.RawArray()oraz mapując NumPy dtypes na ctypes. numpy-sharedmemWydaje 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 sharedmemtablicy, a następnie przekazać je do Processobiektó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-sharedmembraku 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.
multiprocessingsię wykonania kopii całości dla każdego procesu.