2013-03-11 23 views
5

Mam wiele obiektów Ruby z unikatowymi identyfikatorami, które aktualnie buforuję w mieszaniu. Kiedy obiekt ma przypisany identyfikator, przechodzi do skrótu. Pamięć podręczna jest kompletna, tzn. Każdy obiekt z identyfikatorem, który istnieje w zakresie Ruby, powinien również znajdować się w pamięci podręcznej.Pamięć podręczna obiektów Ruby

Mam jednak problem ze znalezieniem sposobu usuwania obiektów z pamięci podręcznej, gdy znikną ze wszystkich innych zakresów. Dzieje się tak, ponieważ obiekty znajdujące się w pamięci podręcznej nie zostaną zebrane.

Czy są jakieś podejścia do tego problemu? Dokumentacja dla WeakRef sugeruje klasę WeakHash, ale nie wydaje się do przyjęcia do praktycznego zastosowania, mimo że jest bardzo blisko tego, co myślę, że potrzebuję dla mojego projektu.

+1

Dlaczego nie byłoby praktyczne? –

+1

WeakRef jest tym, czego potrzebujesz. – Linuxios

Odpowiedz

3

Coś podobnego do WeakHash zrobi to. Oto pełniejsza realizacja które mogą obsługiwać Fixnums, symbole i pływaków (i inne typy niezmienne, jeśli dodać je do listy):

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

Jest to bardzo podobne do przykładu podanego w dokumentacji WeakRef, ale czy tu nie ma wycieku pamięci? Obiekty przechowywane w tym haszu są w rzeczywistości zbierane, ale 'weakhash.count' nigdy nie zmniejsza się. Czy to jest złe? – Vortico

+0

@ Vortico: Nie przeciek pamięci. Po prostu, cóż, liczyć wyciek. Będę edytować i naprawić to. – Linuxios

+0

można użyć 'unless' zamiast' jeśli ' – AJcodez

Powiązane problemy