2017-03-07 4 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 

Ich benutze das obige Snippet in einigen Code und Iterieren über Dateien. Ich habe ein Speicherleck. Wenn ich nur diese 4 Zeilen auskommentiere, die in der Schleife sind, die ich hervorgehoben habe, bleibt mein Code bei konstantem RAM ~ 100mb. Allerdings, wenn ich dies auskommentiere, geht es bis zu ~ 8-9GB super schnell. Bitte helfen Sie !!Speicherleck - Python - Zähler - Listen in Dicts

+0

Sie sollten versuchen, einen [MCVE] dies zu schreiben, wie es ist, Es ist ziemlich schwer für andere, darüber nachzudenken, obwohl die kartesischen Produkte Ihnen eine Pause geben sollten. Es ist auch nicht klar, was Sie zu erreichen versuchen, was der Sinn dieser 'del's ist, etc. 'Mein Code ist kaputt, fix it' tendiert dazu, eine schwierige Frage zu sein, um Hilfe zu bekommen. – pvg

+0

Hinweis: '' | '' ist der bitweise OR-Operator, nicht der boolesche Operator, den Sie wollen - der in Python mit '' oder'' geschrieben wird. '' oder'' ist effizienter, da es die Bewertung der rechten Seite überspringen kann, wenn die linke Seite wahr ist (wodurch das Ergebnis unbedingt wahr wird). – jasonharper

+0

danke für die Rückmeldung! Ich habe eine Lösung gefunden und posten sie unten! –

Antwort

0

Für den Kontext repliziere ich den Algorithmus auf Seite 5 dieses Papiers und erzeuge einen Abhängigkeitsgraphen für Systemaufrufe.

Hier ist der vollständige Code behoben. Im Grunde ging es darum, ein Listenverständnis innerhalb einer Summe zu verwenden, aber ohne Klammern um das Verständnis zu legen. Auf diese Weise Gegenstände wurden zusammengefasst, da sie anstatt zuerst die Liste generiert wurden, den Aufbau ...

Hier ist der Code:

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

Das nennt man einen "Generator-Ausdruck", wenn Sie ihn einmal googeln müssen. – pvg

Verwandte Themen