2017-03-07 10 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行をコメントアウトすれば、私のコードは100Mバイトの一定のRAMにとどまります。しかし、私はこれをコメントを外すと、最大8-9GBの超高速になります。助けてください!!メモリリーク - dictsのpython - counter - lists

+0

あなたはそれがあるとして、この[MCVE]を書いてみる必要があり、デカルト製品があなたに一時停止を与えなければならないものの、他の人が推論するのはかなり難しいです。あなたが達成しようとしていること、これらのデルのポイントが何かなども明確ではありません。「私のコードは壊れていて、修正してください」と助けを求めるのは難しい問題です。 – pvg

+0

注: '' | ''は、ビット単位のOR演算子であり、あなたが必要とするブール演算子ではなく、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

Googleにする必要がある場合は、それは 'ジェネレータ表現'と呼ばれています。 – pvg