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它至少应该使用更少的内存,但我还没有真正测试过它。这也可能取决于最终如何使用结果。