Używam multiprocessing.imap_unordered
do wykonywania obliczeń na listę wartości:wieloprocesorowe Pythona i pamięć
def process_parallel(fnc, some_list):
pool = multiprocessing.Pool()
for result in pool.imap_unordered(fnc, some_list):
for x in result:
yield x
pool.terminate()
Każde wywołanie fnc
zwraca ogromny obiekt w wyniku, przez projekt. Mogę przechowywać N wystąpień takiego obiektu w pamięci RAM, gdzie N ~ cpu_count, ale niewiele więcej (nie setki).
Teraz użycie tej funkcji zajmuje zbyt dużo pamięci. Pamięć jest całkowicie wydatkowana w głównym procesie, a nie w pracownikach.
W jaki sposób imap_unordered
przechowuje wyniki końcowe? Mam na myśli wyniki, które zostały już zwrócone przez pracowników, ale jeszcze nie zostały przekazane użytkownikowi. Myślałem, że to mądre i obliczało je "leniwie" w razie potrzeby, ale najwyraźniej nie.
Wygląda na to, że nie mogę wystarczająco szybko zużyć wyników z process_parallel
, pula utrzymuje w kolejce te ogromne obiekty od fnc
gdzieś, wewnętrznie, a następnie wysadza w powietrze. Czy istnieje sposób, aby tego uniknąć? Jakoś ograniczyć wewnętrzną kolejkę?
Używam Python2.7. Twoje zdrowie.
Cóż z tego, co widzę "wydajność" jest w głównym procesie, nie wewnątrz 'fnc' (tj. Funkcja wykonywana przez pracowników). Czy 'fnc' samo robi leniwą ocenę? – Felix
@FelixBonkoski Nie, 'fnc' pobiera pojedynczy element z' some_list' i oblicza i zwraca z niego ogromny obiekt. – user124114
Ograniczenie tylko w oparciu o dostępną pamięć. –