2013-01-10 10 views
5

Mam aplikację głodny pamięci iteracji przez parę tablic, przetwarzanie każdej kombinacji elementów. Obecnie ten skrypt jest bardzo głodny pamięci RAM. Kończy się przy użyciu około 3 GB pamięci RAM.Czy użycie pamięci jest lepsze w przypadku jednego dużego procesu lub wielu małych procesów?

Moje pytanie jest takie:

Czy to więcej pamięci efektywne przetwarzanie każdej kombinacji elementów w jednym dużym procesie? Czy lepiej jest rozpocząć nowy podproces dla każdej kombinacji.

Innymi słowy, lepiej jest zrobić Wariant 1:

for i in param_set1: 
    for j in paramset2: 
     Do_A_Big_Job(i, j) 

Albo Opcja 2:

import subprocess 

for i in param_set1: 
    for j in paramset2: 
     subprocess.call([Do_A_Big_Job_Script, i, j]) 

Przez "lepsze", to znaczy "zużywają mniej pamięci RAM".

Dzięki!

Edycja Jestem wyraźnie ciekawy wykorzystania pamięci. Kiedy proces się zakończy, czy system UNIX zwolni tę pamięć? Czy jest to bardziej wydajne niż odśmiecanie Pythona dla dobrze napisanego skryptu rozsądnie? Nie mam zbyt wielu rdzeni, więc spodziewam się, że wiele procesów będzie działało mniej więcej równolegle.

+1

Wykorzystanie pamięci zależy od tego, co robisz na "zadaniach" (jakie zmienne przypisujesz i zwalniasz), a nie w jaki sposób je dystrybuujesz. Jeśli każde zlecenie zużywa dużo pamięci, równoległe ich uruchamianie spowoduje utworzenie stosu pamięci. Jedyną korzyścią jest to, że * może * być szybsze. – asermax

+0

Wpisałbym to jako odpowiedź, ale nie sądzę, że to naprawdę kwalifikuje się jako odpowiedź xD Próbowałem tylko podkreślić, że być może kwestionujesz niewłaściwą rzecz. Twoja edycja wydaje się być bardziej precyzyjnym pytaniem i warto poczekać na kogoś, kto wie o tym temacie. Przy okazji dodawanie tagów ułatwi znalezienie problemu (np. UNIX, pamięć, podprocesor itp.) – asermax

Odpowiedz

1

Prowadzenie pojedynczego procesu będzie oczywiście wymagać mniej pamięci RAM, ale utrudni to korzystanie z wielu procesorów/rdzeni.

Jeśli nie obchodzi Cię, ile to trwa, uruchom jeden proces.

Jako kompromis można uruchomić tylko kilka procesów na raz, zamiast uruchamiać je wszystkie naraz.