Предотвратить утечку памяти в Python; cycli c ссылки - PullRequest
1 голос
/ 18 июня 2020

Вчера боролся с утечками памяти в каком-то коде.

Итак, код без лишних деталей:

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".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...