У меня проблема с сценарием большого тиража. Этот скрипт является многопоточной средой для выполнения задач сканирования.Python: как мусор собирать строки
В больших исполнениях потребление памяти сценария становится огромным, и после профилирования памяти с помощью guppy hpy я увидел, что большая часть проблемы поступает по строкам.
Я не храню столько строк: просто получайте содержимое htmls в память, чтобы хранить их в db. После этого строка больше не используется (переменная, содержащая ее, назначается следующей строке).
Проблема возникла из-за того, что я видел, что каждая новая строка (с sys.getrefcount) имеет, по крайней мере, 2 ссылки (1 из моего var и 1 внутренний). Кажется, что переназначение другого значения для моего var не удаляет внутреннюю ссылку, поэтому строка остается в памяти.
Что я могу сделать, чтобы убедиться, что строки собраны в мусор?
Спасибо заранее
EDIT:
1- Я использую Django ORM
2- я получить все эти строки из 2-х источников:
2.1- Непосредственно из сокета (urllib2.urlopen (url) .read())
2.2- Разбор ответов и выдача новых URI из каждой системы html и подачи
SOLVED
Наконец-то я получил ключ. Сценарий является частью среды Django, и кажется, что подпольная группа Django делает кеш или что-то подобное. Я отключил отладку, и все начали работать, как ожидалось (повторное использование отступов, похоже, удаляет ссылки на старые объекты, а объекты собираются gc).
Для тех, кто использует какое-то рамка слоя над питоном, быть в курсе конфигурации: кажется, что некоторые отладочные конфигурации с интенсивным процессом может привести к утечке памяти
Вы попробовали del (my_str_var)? – Marat
если 'sys.getrefcount' возвращает 2, тогда нет внутренней ссылки, потому что когда вы передаете объект' sys.getrefcount'. Это увеличит количество ссылок. – HYRY
Я просто назначаю новые строки старым vars. Очевидно, я доверял сборщику мусора у питонов, но, похоже, этого недостаточно. Попробует добавить «del» в каждом строчном вызове – user989501