2017-03-07 75 views
0
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-9GB。请帮忙!!内存泄漏 - 蟒蛇 - 计数器 - 在词典中的列表

+0

你应该尝试写这样的[MCVE],因为它是,尽管笛卡尔产品应该让你暂停,但其他人很难推断。目前还不清楚你想要完成的是什么,这些“del”的意义是什么等等。“我的代码被破坏了,修复它”往往是一个难以获得帮助的问题。 – pvg

+0

注意:''|''是按位或运算符,而不是您想要的布尔运算符 - 在Python中拼写为''或''。 ''或''效率更高,因为如果左侧是真的,它可以跳过右侧的评估(从而使结果无条件成立)。 – jasonharper

+0

感谢您的反馈!我找到了一个解决方案,并在下面发布它! –

回答

0

对于上下文,我复制本文的第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_dict 
+0

这就是所谓的'发电机表达',如果你需要谷歌它。 – pvg