/ / wieloprzetwarzanie lub wielowątkowość moja funkcja, jak? - python, wielowątkowość, wieloprocesowość, pamięć współdzielona, ​​duże dane

multi-processing lub multi-threading mojej funkcji, jak? - python, wielowątkowość, wieloprocesorowość, pamięć współdzielona, ​​duże zbiory danych

Jestem bardzo nowy w Pythonie. Muszę zasymulować prosty bilans wodny w zbiornikach na deszcz przy użyciu następującej funkcji:

def rain_tank_model(rain, water_demand,roof_area, tank_size, household_name):

# rain and water_demand time series are numpy arrays with over than 8 million recordings.
# each houshold has installed a rain tank with a specific size

v = []  # water volume in tanks
spill = [] # amount of water spills from rain tank
unmet_demand = [] # amount of unmet water demand
volume = 0.0 # stored volume at the start of the simulation
for i in range(len(rain)):
volume += rain[i] * roof_area - water_demand[i]
if volume < 0. : #volume cannot be negative
unmet_demand.append(volume * -1)
volume = 0
v.append(volume)
spill.append(0.)
if volume > tank_size: #water should spill from the tank
spill.append(volume - tank_size)
volume = tank_size
v.append(volume)
unmet_demand.append(0.)
else:
spill.append(0.)
v.append(volume)
unmet_demand.append(0.)

file = open(str(household_name)+".txt", "w")
for i in range(len(v)):
line =str(v[i])+"t"+str(spill[i])+"t"+str(unmet_demand[i])+"n"
file.write(line)
file.close()

Muszę uruchomić tę funkcję dla 50 000 domówkażdy z nich ma konkretny rozmiar zbiornika deszczowego, powierzchnię dachu i serię czasów zapotrzebowania na wodę. Mogę to zrobić, umieszczając funkcję w pętli i iterując po domach. Ponieważ każda symulacja jest całkowicie niezależna (muszą mieć tylko dostęp do tej samej wejściowej tablicy przeciwdeszczowej), pomyślałem, że może mogę użyć wielowątkowości lub wieloprzetwarzania w pythonie, aby przyspieszyć symulację. Czytałem o różnicach między nimi, ale nie mogłem się zorientować, którego powinienem użyć.

Próbowałem wielu procesów (funkcja puli i map)równolegle do uproszczonej wersji funkcji, która przyjmuje tylko tablicę liczb deszczowych jako dane wejściowe (zakładając, że wielkość zbiornika i powierzchnia dachu są takie same dla każdego domu, a zapotrzebowanie na wodę jest zawsze stałe. Powodem uproszczenia jest to, że nie mogłem zrozumieć, w jaki sposób do wprowadzenia wielu argumentów. Miałem 20 domów do symulacji. Metoda zapętlania była znacznie szybsza niż metoda wieloprzetwarzania. Próbowałem różnej liczby pul od 2 do 20. Próbowałem udostępniać dane deszczu między procesami przy użyciu opcji zarządzania ale nie odniosło sukcesu. Dużo czytałem, ale były one bardzo zaawansowane i trudne do zrozumienia. Byłbym wdzięczny za wskazówkę, jak zrównoważyć tę funkcję lub jakikolwiek odnośnik do podobnych przykładów.

Odpowiedzi:

0 dla odpowiedzi № 1

Krótka odpowiedź brzmi:

Jeśli twoja funkcja jest związana z procesorem - użyj wieloprocesorowości, a jeśli IO - użyj wielowątkowości.

Trochę dłuższa odpowiedź:

Python ma świetną funkcję o nazwie GIL, ta blokada zapewnia ogromne ograniczenia: jeden plik może być interpretowany według jednego wątku w danym momencie. Więc jeśli masz dużo obliczeń, wielowątkowość będzie wyglądać jak wykonywanie równoległe, ale w rzeczywistości tylko jeden wątek będzie aktywny w określonym momencie.

W rezultacie wielowątkowość jest dobra dla powiązań IOoperacje, takie jak na przykład pobieranie danych, możesz ustawić pobieranie pliku w jednym wątku i wykonywanie innych operacji w innym, aby nie czekać na zakończenie pobierania.

Jeśli więc chcesz wykonywać obliczenia równoległe, lepiej jest korzystać z przetwarzania wieloprocesowego. Ale nie należy zapominać, że każdy proces ma własną pamięć RAM (w wielowątkowej pamięci RAM jest współużytkowana przez wątki).

UPD

Istnieją sposoby współdzielenia pamięci między procesami, więcej informacji można znaleźć tutaj: https://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes.