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
Odpowiedz
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 ! -).
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()
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 .
del
Albo None
są twoje tylko znajomych
>>> a = "Hello"
>>> a = None
Or
>>> del a
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. –
'del a' nie usuwa obiektu (tylko notatkę, nie sugerując, że to sugerujesz) – hasen
- 1. Usuwanie śmieci w wątkach Perla
- 2. C# Timery i usuwanie śmieci
- 3. Ręczne usuwanie ekranu powitalnego w PhoneGap
- 4. . Usuwanie śmieci .NET - na co wpływa?
- 5. Tworzenie gier na Androida i usuwanie śmieci
- 6. Jak wymusić pełne usuwanie śmieci w .NET 4.x?
- 7. Usuwanie wielu dokumentów MongoDB w Pythonie
- 8. Usuwanie kolumny z zagnieżdżonej listy w Pythonie
- 9. Kiedy odbywa się usuwanie śmieci dla klasy z danymi statycznymi
- 10. Usuwanie plików według typu w Pythonie w systemie Windows
- 11. Wyrzucanie śmieci w bashu
- 12. Odbiór śmieci w Delphi
- 13. Czy można zatrzymać zbieranie śmieci .NET?
- 14. Ręczne wstawianie danych w Firebase
- 15. Ręczne wywołanie DbMigration.Up w EF
- 16. Ręczne wyrównanie różnic w KDiff3
- 17. Wstawianie i usuwanie do/z posortowanej listy w Pythonie
- 18. Usuwanie i zmiana powiązania zdarzenia tkinter w pythonie
- 19. Usuwanie ciągów z listy zawierającej liczby w pythonie
- 20. Jak wyłączyć usuwanie śmieci w Xcode 4.5 i pozbyć się błędu klang 1 przy włączaniu ARC?
- 21. Czy obiekty C++ w kodzie źródłowym JNI systemu Android wywołują usuwanie śmieci?
- 22. Ręczne edytowanie pliku * .designer.cs
- 23. Zbieranie śmieci w dalvik vm
- 24. Datepicker Jquery - ręczne wyzwalanie
- 25. Ręczne uwierzytelnianie systemu Windows
- 26. Ręczne tworzenie projektu WPF
- 27. Ręczne ustawianie ID
- 28. Wykrywanie ręczne OpenCV?
- 29. Ręczne ustawienie stanu UIButton
- 30. Ręczne wydanie ComPtr
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
Powinieneś również przejść do Python 3.1 jak najszybciej. 3.0 ma wiele znanych problemów i nie jest już obsługiwany. –
Jak tylko skończę honory, zamierzam. – Casebash