file_dict = {}
for calli, callj in itertools.product(feats,feats):
keys = seqd.keys()
if (not calli in keys) | ((not callj in keys)):
continue
else:
lst = []
##### this is the problematic part !!!!!!!!!
for jj, ii in itertools.product(seqd[callj], seqd[calli]):
if (jj - ii) > 0:
lst.append(1. / (jj - ii))
del jj,ii
entry = sum(lst)
del lst
file_dict[str(calli) + " " + str(callj) + " distance"] = entry我在一些代码中使用了上面的代码片段,并对文件进行迭代。我有某种类型的内存泄漏。如果我只注释掉我突出显示的循环中的4行代码,我的代码保持在恒定的RAM ~100mb。然而,当我取消对此的注释时,它会以超快的速度上升到8-9 9GB。请帮帮我!!
发布于 2017-03-07 12:27:12
对于上下文,我复制了本文第5页上的算法,生成了一个系统调用依赖图。
下面是完整的代码修复。它基本上涉及到在总和中使用列表理解,但没有用括号括起理解。这样,项目就会在生成时进行汇总,而不是首先构建列表……
代码如下:
def graph_maker_dict(feats, calls):
# get dictionary of present calls and list of indexes where they appear
seqd = defaultdict(list)
for v, k in enumerate(calls):
seqd[k].append(v)
# run calculations with list comprehensions
file_dict = {}
for calli, callj in itertools.product(feats,feats):
keys = seqd.keys()
if (not calli in keys) or ((not callj in keys)):
continue
else:
entry = sum(1. / (jj - ii) for jj in seqd[callj] for ii in seqd[calli] if (jj - ii) > 0)
file_dict[calli[:2] + " " + callj[:2] + " distance"[:2]] = entry
return file_dicthttps://stackoverflow.com/questions/42638745
复制相似问题