Я использую модуль ipyparallel для ускорения сравнения списков типа «все по всем», но у меня возникают проблемы с огромным потреблением памяти.
Вот упрощенная версия скрипта, который я запускаю:
Из сценария SLURM запустите кластер и запустите сценарий python
ipcluster start -n 20 --cluster-id="cluster-id-dummy" &
sleep 60
ipython /global/home/users/pierrj/git/python/dummy_ipython_parallel.py
ipcluster stop --cluster-id="cluster-id-dummy"
В python создайте два списка списков для упрощенного примера
import ipyparallel as ipp
from itertools import compress
list1 = [ [i, i, i] for i in range(4000000)]
list2 = [ [i, i, i] for i in range(2000000, 6000000)]
Затем определите мою функцию сравнения списков:
def loop(item):
for i in range(len(list2)):
if list2[i][0] == item[0]:
return True
return False
Затем подключитесь к моим двигателям i python, pu sh list2 к каждому из них и сопоставьте мою функцию:
rc = ipp.Client(profile='default', cluster_id = "cluster-id-dummy")
dview = rc[:]
dview.block = True
lview = rc.load_balanced_view()
lview.block = True
mydict = dict(list2 = list2)
dview.push(mydict)
trueorfalse = list(lview.map(loop, list1))
Как уже упоминалось , Я запускаю это в кластере с использованием SLURM и получаю данные об использовании памяти с помощью команды sacct. Вот использование памяти, которое я получаю для каждого из шагов:
Просто создаю два списка: 1,4 ГБ Создание двух списков и отправка их в 20 двигателей: 22,5 ГБ Все: 62,5 ГБ ++ (здесь я получить сбой OUT_OF_MEMORY)
Из-за запуска htop на узле во время выполнения задания кажется, что использование памяти медленно увеличивается с течением времени, пока не достигнет максимального объема памяти и произойдет сбой.
I просмотрел этот предыдущий поток и безуспешно реализовал несколько предложенных решений
Утечка памяти в модуле I Python .parallel?
Я попытался очистить представление с помощью каждый l oop:
def loop(item):
lview.results.clear()
for i in range(len(list2)):
if list2[i][0] == item[0]:
return True
return False
Я попытался очистить клиента каждым l oop:
def loop(item):
rc.purge_everything()
for i in range(len(list2)):
if list2[i][0] == item[0]:
return True
return False
И я попытался использовать флаги --nodb и --sqlitedb с ipcontroller и запустил мой кластер следующим образом:
ipcontroller --profile=pierrj --nodb --cluster-id='cluster-id-dummy' &
sleep 60
for (( i = 0 ; i < 20; i++)); do ipengine --profile=pierrj --cluster-id='cluster-id-dummy' & done
sleep 60
ipython /global/home/users/pierrj/git/python/dummy_ipython_parallel.py
ipcluster stop --cluster-id="cluster-id-dummy" --profile=pierrj
К сожалению, ничего из этого не помогло и привело к точно такой же ошибке нехватки памяти.
Любые советы или помощь были бы очень полезны получено!