2013-03-11 2 views
5

Ich habe eine Reihe von Ruby-Objekten mit eindeutigen IDs, die ich derzeit in einem Hash zwischenspeichern. Wenn einem Objekt eine ID zugewiesen wird, geht es in den Hash. Der Cache ist vollständig, d. H. Jedes Objekt mit einer ID, die im Ruby-Bereich vorhanden ist, sollte sich ebenfalls im Cache befinden.Ruby-Objekt-Cache

Allerdings habe ich Probleme, einen Weg zu finden, Objekte aus dem Cache zu löschen, sobald sie aus allen anderen Bereichen verschwinden. Dies liegt natürlich daran, dass Objekte, die im Cache enthalten sind, nicht als Müll gesammelt werden.

Gibt es Ansätze für dieses Problem? Die Dokumentation für WeakRef schlägt eine WeakHash Klasse vor, aber es scheint nicht akzeptabel für den praktischen Einsatz, obwohl es sehr nahe ist, was ich denke, dass ich für mein Projekt brauche.

+1

Warum wäre es nicht sinnvoll sein? –

+1

WeakRef ist was du brauchst. – Linuxios

Antwort

3

Ähnlich wie WeakHash wird es tun. Hier ist eine vollständigere Implementierung, die Fixnums, Symbole verarbeiten kann, und Floats (und andere unveränderliche Typen, wenn Sie sie zur Liste hinzufügen):

class WeakHash < Hash 
    def []=(k, v) 
    if(![Fixnum, Symbol, Float].include? k.class) 
     k = WeakRef.new(k) 
    end 
    if(![Fixnum, Symbol, Float].include? v.class) 
     v = WeakRef.new(v) 
    end 
    super k,v 
    end 
end 
+0

Dies ist dem in der WeakRef-Dokumentation angegebenen Beispiel sehr ähnlich, aber gibt es hier kein Speicherleck? Die Objekte, die in diesem Hash gespeichert sind, werden tatsächlich als Müll gesammelt, aber "weakshash.count" nimmt niemals ab. Ist das eine schlechte Sache? – Vortico

+0

@vortico: Kein Speicherleck. Nur, naja, ein Zählleck. Ich werde das bearbeiten und reparieren. – Linuxios

+0

können Sie 'if' anstelle von' if! 'Verwenden – AJcodez