首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存泄漏- python - dicts中的计数器列表

内存泄漏- python - dicts中的计数器列表
EN

Stack Overflow用户
提问于 2017-03-07 09:47:13
回答 1查看 303关注 0票数 0
代码语言:javascript
复制
    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。请帮帮我!!

EN

回答 1

Stack Overflow用户

发布于 2017-03-07 12:27:12

对于上下文,我复制了本文第5页上的算法,生成了一个系统调用依赖图。

下面是完整的代码修复。它基本上涉及到在总和中使用列表理解,但没有用括号括起理解。这样,项目就会在生成时进行汇总,而不是首先构建列表……

代码如下:

代码语言:javascript
复制
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_dict
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42638745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档