Доступ к куче памяти в python

#python #memory

Вопрос:

Есть ли способ получить доступ к куче памяти в Python? Меня интересует возможность доступа ко всем объектам, выделенным в памяти запущенного экземпляра.

Комментарии:

1. Если я не ошибаюсь и не неправильно понимаю вопрос, вы можете сделать globals()

2. @Sujay: Это показывает вам только то, что видно в глобальном масштабе в текущем модуле. Добавление locals() также позволит вам просмотреть локальные области в заданной области функций, но даже в этом случае вы не увидите области замыкания/класса/экземпляра, а также переменные, выделенные в других локальных областях или в глобальных других модулях.

3. Дело в том, что «куча» является общим хранилищем для каждого динамически выделяемого объекта во всей программе (в CPython сам стек C не хранит почти ничего интересного для наблюдателя; сам стек вызовов уровня Python также выделяется в куче), это не просто несколько вещей, непосредственно видимых в области LEGB в любой данный момент времени.

Ответ №1:

Вы не можете получить прямой доступ, но gc модуль должен делать большую часть того, что вы хотите. Простой gc.get_objects() вызов вернет все объекты, отслеживаемые сборщиком. Это не все, поскольку с CPython сборщик мусора занимается только с потенциальными ссылочные циклы (так что встроенные типы, которые не могут ссылаться на другие объекты, например int , float , str , и т. д.) не появляются в результате list , но все они будут ссылаться на то , что list (если бы они не были, их счетчик ссылок будет равен нулю и они были утилизированы).

Кроме того, вы можете получить более целенаправленное использование inspect модуля, особенно проверку кадров стека, используя traceback модуль для «простого форматирования» или вручную копаясь в самих полудокументированных объектах кадра, что позволит вам сузить область действия до определенной активной области в кадре стека.

Для решения, наиболее близкого к куче, вы можете использовать tracemalloc модуль для отслеживания и записи распределений по мере их возникновения, или pdb отладчик для самоанализа извне (возможно, добавляя breakpoint() вызовы в ваш код, чтобы он автоматически останавливался, когда вы достигнете этой точки, чтобы вы могли осмотреться).