Форум сайта python.su
Доброго время суток.
Вопрос “толстый”. Как в питоне можно уменьшить размер приложения в ОЗУ. В общем вопросов такого характера у меня много. Например писал недавно тесты. У программы три окна, которые оформлены в классы. Писал за спасибо и на скорую руку. После когда отдал работу сел по привычке посмотреть используемую память и процессор. После каждого витка теста (в конце программа предлагает пройти тот же тест заново или выбрать новый + конечно же выход) количество используемой оперативки увеличивается. Код не покажу ибо на скорую руку написан потому не хочу позориться. Да и строк там полторы сотни. Возможно ли придерживаясь каких то правил либо используя какие то инструменты не давать программе пожирать ОЗУ?
Офлайн
Нужно не допускать возникновения циклических ссылок, когда два объекта ссылаются друг на друга (точнее корректно такие ситуации обрабатывать). В этом случае даже после выхода обоих объектов из зоны видимости они не будут уничтожены сборщиком мусора и продолжат занимать память. Как правило, такие ситуации отслеживаются профайлером памяти, когда вы видите в процессе выполнения программы какие объекты плодятся и не удаляются. Но в случае со 150 строками это должно и так бросаться в глаза.
Офлайн
Опа, интересно! А что делать если у меня есть циклический объект? Это такое зацикленное дерево на словарях, по которому определяется текущее состояние как у Тюринга. Такой вот упрощённый код на питоне:
m__string = {'ref': {}, 'type': 'string'}
m__cmd = {'ref': {}}
CMD = {"a" : m__string,
"b" : m__cmd
}
m__cmd['ref'] = CMD
Офлайн
alexx11
Вы dcult можете воспользоваться модулем weakref и сделать одну из ссылок “слабой”, тем самым избежав жесткой циклической зависимости.
Офлайн
Спасибо, типо того получилось:
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()
Отредактировано (Дек. 5, 2010 23:07:14)
Офлайн
Слухи про то, что Питон не умеет уничтожать циклические ссылки - сильно преувеличены. Хотя, конечно, существует много нюансов.
Слабые ссылки - вещь хорошая.
Офлайн
А ну еще есть какие то правила которые помогут уменьшить размер в памяти ээээ ну до профайлинга.
Офлайн
Грозно нахмурить брови и жестким уверенным голосом потребовать: “Изыди!”
Какие-такие правила? Нужно измерять, а потом думать. Сначала измерять, это обязательный шаг.
Офлайн