Использование памяти растет с RoboBrowser?
[Отредактировано, чтобы упростить пример / лучше изолировать проблему]
С помощью RoboBrowser
при нескольких последующих посещениях одного и того же URL объем памяти увеличивается с каждым посещением, даже если вы переинициализируете и перезаписываете исходный RoboBrowser
экземпляр каждый раз. Это противоречит моей интуиции о том, как работает управление памятью в Python, и я хочу понять, почему.
Чтобы продемонстрировать это, вот профиль памяти для скрипта, который посещает https://news.ycombinator.com/ask и получает все div (я специально сделал это повторяющимся, чтобы профиль памяти был более полным):
Line # Mem usage Increment Line Contents
================================================
5 19.684 MiB 0.000 MiB @profile
6 def scrape():
7
8 19.684 MiB 0.000 MiB url='https://news.ycombinator.com/ask'
9
10 19.719 MiB 0.035 MiB browser = RoboBrowser(parser="html.parser", history=0)
11 25.102 MiB 5.383 MiB browser.open(url)
12 26.598 MiB 1.496 MiB browser.find_all('div')
13
14 26.602 MiB 0.004 MiB time.sleep(1)
15
# re-initialising the browser doesn't free up memory:
16 26.609 MiB 0.008 MiB browser = RoboBrowser(parser="html.parser", history=0)
17 27.535 MiB 0.926 MiB browser.open(url)
18 27.859 MiB 0.324 MiB browser.find_all('div')
19
# also doesn't free up memory:
20 27.859 MiB 0.000 MiB browser = None
Вот другой скрипт, который работает как я ожидаю:
Line # Mem usage Increment Line Contents
================================================
5 20.102 MiB 0.000 MiB @profile
6 def make_string():
7 20.148 MiB 0.000 MiB a = 'a'*1000000
8 21.109 MiB 0.961 MiB a = a + 'a'
9 20.148 MiB -0.961 MiB a = None # memory usage drops as expected
Почему при очистке выделенная память просто копится? Что я должен изучить, чтобы лучше понять эту проблему?
Я генерирую очищающий профиль памяти, запустив python -m memory_profiler mem_test.py
используя Python 2.7.6
Полный скрипт для mem_test.py
:
время импорта import memory_profiler из robobrowser.browser импорт RoboBrowser
@profile
def scrape():
url='https://news.ycombinator.com/ask'
browser = RoboBrowser(parser="html.parser", history=0)
browser.open(url)
browser.find_all('div')
time.sleep(1)
browser = RoboBrowser(parser="html.parser", history=0)
browser.open(url)
browser.find_all('div')
browser = None
if __name__=='__main__':
scrape()