Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在长时间运行脚本后出现内存分配错误_Python - Fatal编程技术网

Python在长时间运行脚本后出现内存分配错误

Python在长时间运行脚本后出现内存分配错误,python,Python,我有这样一段代码,可以刮取用户名: def fetch_and_parse_names(url): html = requests.get(url).text soup = BeautifulSoup(html, "lxml") return (a.string for a in soup.findAll(href=USERNAME_PATTERN)) def get_names(urls): # Create a concurrent executor

我有这样一段代码,可以刮取用户名:

def fetch_and_parse_names(url):
    html = requests.get(url).text
    soup = BeautifulSoup(html, "lxml")
    return (a.string for a in soup.findAll(href=USERNAME_PATTERN))

def get_names(urls):
    # Create a concurrent executor
    with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:

        # Apply the fetch-and-parse function concurrently with executor.map,
        # and join the results together
        return itertools.chain.from_iterable(executor.map(fetch_and_parse_names, urls))

def get_url(region, page):
    return 'http://lolprofile.net/leaderboards/%s/%d' % (region, page)
当它开始把所有的名字放在这样一个列表中

urls = [get_url(region, i) for i in range(start, end + 1)]
names = (name.lower() for name in get_names(urls) if is_valid_name(name))

在停止运行一个小时后,我得到了内存分配错误,显然我知道为什么会发生这种情况,但我如何才能修复它?我在想从一个页面中获取用户名并立即输出到文件中,删除列表的内容,重复,但是我不知道如何实现这一点。

您可以使用来增加进程分配的内存,因为进程的线程使用其父进程的内存,它们无法分配额外内存。

您使用的代码将所有下载的文档保留在内存中,原因有两个:

  • 返回
    a.string
    ,它不仅是
    str
    ,而且是
    bs4.element.NavigableString
    ,因此保留对其父元素的引用,并最终保留对整个文档树的引用
  • 返回一个生成器表达式,该表达式将捕获本地上下文(在本例中为
    soup
    ),直到使用为止
解决此问题的一种方法是使用:

return [str(a.string) for a in soup.findAll(href=USERNAME_PATTERN)]

这样就不会保留对soup对象的引用,表达式会立即执行,并返回一个
str
s列表。

就这样?哦,上帝,我不知道这一点,我觉得很愚蠢,非常感谢@edsheeran它至少应该使用更少的内存,但我还没有真正测试过它。这也可能取决于最终如何使用结果。