Найти - Пользователи
Полная версия: Память
Начало » Python для новичков » Память
1
CryptSpirit
Доброго время суток.
Вопрос “толстый”. Как в питоне можно уменьшить размер приложения в ОЗУ. В общем вопросов такого характера у меня много. Например писал недавно тесты. У программы три окна, которые оформлены в классы. Писал за спасибо и на скорую руку. После когда отдал работу сел по привычке посмотреть используемую память и процессор. После каждого витка теста (в конце программа предлагает пройти тот же тест заново или выбрать новый + конечно же выход) количество используемой оперативки увеличивается. Код не покажу ибо на скорую руку написан потому не хочу позориться. Да и строк там полторы сотни. Возможно ли придерживаясь каких то правил либо используя какие то инструменты не давать программе пожирать ОЗУ?
Soteric
Нужно не допускать возникновения циклических ссылок, когда два объекта ссылаются друг на друга (точнее корректно такие ситуации обрабатывать). В этом случае даже после выхода обоих объектов из зоны видимости они не будут уничтожены сборщиком мусора и продолжат занимать память. Как правило, такие ситуации отслеживаются профайлером памяти, когда вы видите в процессе выполнения программы какие объекты плодятся и не удаляются. Но в случае со 150 строками это должно и так бросаться в глаза.
alexx11
Опа, интересно! А что делать если у меня есть циклический объект? Это такое зацикленное дерево на словарях, по которому определяется текущее состояние как у Тюринга. Такой вот упрощённый код на питоне:
m__string = {'ref': {}, 'type': 'string'}
m__cmd = {'ref': {}}

CMD = {"a" : m__string,
"b" : m__cmd
}
m__cmd['ref'] = CMD
Это находится в отделном модуле, и доступ к этой перемнной я получаю xmodule.m__cmd. Приложение работает через WSGI, как мне корректно использовать эту переменную (что сделать до, что после), или может это вообще не правильно с точки зрения питона, но от циклического дерева отказаться не могу.
Александр Кошелев
alexx11
Вы dcult можете воспользоваться модулем weakref и сделать одну из ссылок “слабой”, тем самым избежав жесткой циклической зависимости.
alexx11
Спасибо, типо того получилось:
from weakref import ref

class Dict(dict):
pass

m__string = {'ref': {}, 'type': 'string'}
m__cmd = {'ref': {}}

CMD = Dict({"a" : m__string,
"b" : m__cmd
})
_CMD = ref(CMD)
m__cmd['ref'] = _CMD()
Андрей Светлов
Слухи про то, что Питон не умеет уничтожать циклические ссылки - сильно преувеличены. Хотя, конечно, существует много нюансов.
Слабые ссылки - вещь хорошая.
CryptSpirit
А ну еще есть какие то правила которые помогут уменьшить размер в памяти ээээ ну до профайлинга.
Андрей Светлов
Грозно нахмурить брови и жестким уверенным голосом потребовать: “Изыди!”

Какие-такие правила? Нужно измерять, а потом думать. Сначала измерять, это обязательный шаг.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB