使用RoboBrowser,内存使用会永远增长?

时间:2017-04-30 13:23:16

标签: python-2.7 memory-management web-scraping beautifulsoup robobrowser

[已编辑以简化示例/更好地隔离问题]

使用RoboBrowser对同一网址进行多次后续访问会导致内存随着每次访问而增长,即使每次重新初始化并覆盖原始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 2.7.6运行python -m memory_profiler mem_test.py来生成抓取内存配置文件

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 个答案:

没有答案