我正在使用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
然后连接到我的ipython引擎,将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 Gb 创建两个列表并将它们推送到20个引擎:22.5 Gb 全部过程:62.5 Gb++(这是我遇到OUT_OF_MEMORY故障的地方)
通过在运行作业时在节点上运行htop,看起来内存使用率会随着时间的推移而缓慢增加,直到达到最大内存并失败。
我浏览了一下之前的帖子,并实施了一些建议的解决方案,但没有成功
我尝试了每次循环都清除视图:
def loop(item):
lview.results.clear()
for i in range(len(list2)):
if list2[i][0] == item[0]:
return True
return False
我尝试在每个循环中清除客户端:
def loop(item):
rc.purge_everything()
for i in range(len(list2)):
if list2[i][0] == item[0]:
return True
return False
我尝试使用ipcontroller的--nodb和--sqlitedb标志,以以下方式启动我的集群:
--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
很不幸,这些都没有帮助,导致了完全相同的内存不足错误。
任何建议或帮助将不胜感激!