Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 5, 2010 10:33:12

CryptSpirit
От:
Зарегистрирован: 2010-05-05
Сообщения: 88
Репутация: +  0  -
Профиль   Отправить e-mail  

Память

Доброго время суток.
Вопрос “толстый”. Как в питоне можно уменьшить размер приложения в ОЗУ. В общем вопросов такого характера у меня много. Например писал недавно тесты. У программы три окна, которые оформлены в классы. Писал за спасибо и на скорую руку. После когда отдал работу сел по привычке посмотреть используемую память и процессор. После каждого витка теста (в конце программа предлагает пройти тот же тест заново или выбрать новый + конечно же выход) количество используемой оперативки увеличивается. Код не покажу ибо на скорую руку написан потому не хочу позориться. Да и строк там полторы сотни. Возможно ли придерживаясь каких то правил либо используя какие то инструменты не давать программе пожирать ОЗУ?



Офлайн

#2 Дек. 5, 2010 10:53:21

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Память

Нужно не допускать возникновения циклических ссылок, когда два объекта ссылаются друг на друга (точнее корректно такие ситуации обрабатывать). В этом случае даже после выхода обоих объектов из зоны видимости они не будут уничтожены сборщиком мусора и продолжат занимать память. Как правило, такие ситуации отслеживаются профайлером памяти, когда вы видите в процессе выполнения программы какие объекты плодятся и не удаляются. Но в случае со 150 строками это должно и так бросаться в глаза.



Офлайн

#3 Дек. 5, 2010 20:50:30

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

Память

Опа, интересно! А что делать если у меня есть циклический объект? Это такое зацикленное дерево на словарях, по которому определяется текущее состояние как у Тюринга. Такой вот упрощённый код на питоне:

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

CMD = {"a" : m__string,
"b" : m__cmd
}
m__cmd['ref'] = CMD
Это находится в отделном модуле, и доступ к этой перемнной я получаю xmodule.m__cmd. Приложение работает через WSGI, как мне корректно использовать эту переменную (что сделать до, что после), или может это вообще не правильно с точки зрения питона, но от циклического дерева отказаться не могу.



Офлайн

#4 Дек. 5, 2010 22:15:01

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Память

alexx11
Вы dcult можете воспользоваться модулем weakref и сделать одну из ссылок “слабой”, тем самым избежав жесткой циклической зависимости.



Офлайн

#5 Дек. 5, 2010 22:59:03

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

Память

Спасибо, типо того получилось:

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)

Офлайн

#6 Дек. 6, 2010 09:44:28

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Память

Слухи про то, что Питон не умеет уничтожать циклические ссылки - сильно преувеличены. Хотя, конечно, существует много нюансов.
Слабые ссылки - вещь хорошая.



Офлайн

#7 Дек. 6, 2010 23:09:09

CryptSpirit
От:
Зарегистрирован: 2010-05-05
Сообщения: 88
Репутация: +  0  -
Профиль   Отправить e-mail  

Память

А ну еще есть какие то правила которые помогут уменьшить размер в памяти ээээ ну до профайлинга.



Офлайн

#8 Дек. 7, 2010 02:10:44

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Память

Грозно нахмурить брови и жестким уверенным голосом потребовать: “Изыди!”

Какие-такие правила? Нужно измерять, а потом думать. Сначала измерять, это обязательный шаг.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version