Korzystam z modułu Pythona multiprocessing
do równoległego przetwarzania dużych tablic numpy. Tablice są odwzorowywane w pamięci przy użyciu numpy.load(mmap_mode='r')
w procesie nadrzędnym. Po tym, multiprocessing.Pool()
przedstawia proces (przypuszczam).NumPy vs. wieloprocesorowość i mmap
Wszystko wydaje się działać dobrze, z wyjątkiem jestem coraz linie takie jak:
AttributeError ("obiekt 'NoneType' nie ma atrybutu 'mówią'") w
<bound method memmap.__del__ of memmap([ 0.57735026, 0.57735026, 0.57735026, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ], dtype=float32)>
ignorowane
w unittest logs. Testy jednak mijają dobrze.
Każdy pomysł, co się tam dzieje?
Korzystanie z Pythona 2.7.2, OS X, NumPy 1.6.1.
UPDATE:
Po Trcohę, że ścigani przyczynę na ścieżkę kodu, który był przy użyciu (mały kawałek) Ten odwzorowany pamięci numpy tablicy jako dane wejściowe do Pool.imap
połączenia.
Najwyraźniej "kwestia" polega na tym, że multiprocessing.Pool.imap
przekazuje dane wejściowe do nowych procesów: wykorzystuje pikle. To nie działa z mmap
ed numpy tablicami i czymś wewnątrz przerw, które prowadzi do błędu.
Znalazłem this reply Roberta Kerna, który wydaje się adresować ten sam problem. Sugeruje utworzenie specjalnej ścieżki kodu, gdy wejście imap
pochodzi z tablicy odwzorowanej w pamięci: mapowanie pamięci w tej samej tablicy ręcznie w zarodkowanym procesie.
To byłoby tak skomplikowane i brzydkie, że wolałbym żyć z błędem i dodatkowymi kopiami pamięci. Czy istnieje inny sposób, który byłby lżejszy przy modyfikowaniu istniejącego kodu?
Joe twoje odpowiedzi zawsze rock. Właśnie próbowałem wymyślić coś takiego. – YXD
Dzięki za końcówkę HDF. Wygląda na ogromną zmianę, ale może warto, sprawdzę to. – user124114