2009-10-29 14 views
16

Czy istnieje sposób na ręczne usunięcie obiektu, którego zbieranie śmieci nie chce się pozbyć, nawet jeśli zadzwonię pod numer gc.collect()? Praca w Pythonie 3.0Ręczne usuwanie śmieci w Pythonie

+1

Nie wiem o Pythonie, ale niektórzy śmieciarze czasami błędnie myślą, że rzeczy nadal są w użyciu, ponieważ znajdują * to, co * wydaje się być odniesieniem do tych obiektów (ale w rzeczywistości nimi nie są). W takich przypadkach niewiele można zrobić. – Artelius

+1

Powinieneś również przejść do Python 3.1 jak najszybciej. 3.0 ma wiele znanych problemów i nie jest już obsługiwany. –

+2

Jak tylko skończę honory, zamierzam. – Casebash

Odpowiedz

24

Per the docs, gc.get_referrers(thatobject) powie dlaczego obiekt jest nadal żywy (to zrobić zaraz po gc.collect() aby upewnić się, że niepożądane "liveness" będzie trwałe). Potem to jakaś czarna sztuka ;-). Często przekonasz się, że niektóre z odesłań są listami (więc DLACZEGO chodzi o listę odnoszącą się do thatobject? Możesz ją ustawić w trybie awaryjnym, ale normalne brzmienie kodu jest lepsze ...), a jeszcze częściej dict s (z których wiele może być __dict__ s niektórych instancji klas lub innych - często nie jest banalne, aby dowiedzieć się, który z nich ... ponownie, usuwanie brute-force jest czasami celowym rozwiązaniem awaryjnym, ale nigdy nie jest to zrównoważony system o dużym zasięgu ! -).

1

To zależy od tego, na czym działa twój Python. Here's good article który wyjaśnia szczegóły

Cytując:

W obecnych wydaniach CPython, każdy nowy przydział do x wewnątrz pętli wyda wcześniej przydzielonego zasobu. Korzystanie z GC nie gwarantuje tego. Jeśli chcesz napisać kod, który będzie działał z każdą implementacją Pythona, powinieneś jawnie zamknąć zasób; to będzie działać niezależnie od GC:

for name in big_list: 
    x = Resource() 
    do something with x 
    x.close() 
4

Jeśli GC odmawia ją zniszczyć, to dlatego, że mają odniesienie do niej gdzieś. Pozbądź się referencji, a ona (w końcu) pójdzie. Na przykład:

myRef = None 

Należy pamiętać, że GC nie może koniecznie zniszczyć obiekt, chyba że musi.

Jeśli twój obiekt zatrzymuje zasoby nie będące pod kontrolą Pythona (np. Niektóre sztuczki z kodem C wywołanym z Pythona), obiekt powinien dostarczyć wywołanie zwolnienia zasobów, aby można było zrobić to kiedy chcesz, a nie wtedy, gdy Python zdecyduje .

4

del Albo None są twoje tylko znajomych

>>> a = "Hello" 
>>> a = None 
Or 
>>> del a 
+1

Niekoniecznie prawda. Obiekt musi być nieosiągalny (lub mieć uzgodnioną jednorazową licznik, który, mam nadzieję, zgadza się z poprzednim), aby kwalifikować się do rekultywacji. –

+5

'del a' nie usuwa obiektu (tylko notatkę, nie sugerując, że to sugerujesz) – hasen