Использование памяти растет с 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()

0 ответов

Другие вопросы по тегам