Вчера боролся с утечками памяти в каком-то коде.
Итак, код без лишних деталей:
from typing import List
class Something(object):
def __init__(self):
super().__init__()
self.something_new = None
class SomethingNew(object):
def __init__(self, i: int = 0, something: Something = None):
super().__init__()
self.i = i
self.something = something
def add_something(collection: List[Something], i: int):
something = Something()
something.something_new = SomethingNew(i, something)
collection.append(something)
def check_memory(collection: List[Something]):
# for e in collection:
# e.something_new.something = None
collection.clear()
def main():
collection = list()
for i in range(1, 1024 * 128):
add_something(collection, i)
check_memory(collection)
if __name__ == '__main__': main()
Если мы включим ручную вырезку ссылок (раскомментируйте закомментированные строки ). Все заработает правильно. Память освободится после выхода из метода memory_check. Например, мы могли бы проверить это с помощью библиотеки: https://pypi.org/project/memory-profiler/.
Есть ли у кого-нибудь лучшие практики для предотвращения ручного вырезания ссылок cycli c? Буду очень признателен за любые советы. Я считаю, что для решения этой проблемы существует истинный "путь pythoni c".