我正在尝试使用词典为我的抓取工具索引网页,而且我遇到了一些有趣的内存问题。
我正在为索引创建一个字典(格式:关键字:[url1,url2,url3,...]),我将用它来跟踪哪些页面包含哪些单词。当我收集网页时,我使用add_page_to_index()函数
def add_page_to_index(self, url):
for keyword in url.get_text().split():
self.add_to_index(keyword, url)
def add_to_index(self, keyword, url):
for word in self.index:
if word == keyword:
if url not in self.index[word]:
self.index[word].append(url)
return
# not found, add new keyword to index
self.index[keyword] = [url]
这段代码对我很有帮助(我知道它有性能问题,但效率并不是这个项目的关键),但当我将add_to_index()更改为:
def add_to_index(self, keyword, url):
if keyword in self.index:
self.index[keyword].append(url)
else: # not found, add new keyword to index
self.index[keyword] = [url]
突然python的内存使用量猛增(我最终得到了一个MemoryError)。这是我的代码的问题还是有其他解释?
请注意,我是一名高中生,所以我不一定拥有最广泛的编程背景。
谢谢!
编辑:将其更改为原始版本。
答案 0 :(得分:0)
两组代码之间的主要区别在于以下行,它只出现在内存中:
if keyword in self.index:
我在这种情况下的猜测是self.index
非常大,每次调用该方法时都必须通过self.index
查看是什么让你感到害怕。
您还应该查看是否一定要将所有收集的数据同时存储在解释器内存中。你可能最好尽可能多地存储数据,例如csv,redis等等。
答案 1 :(得分:0)
罪魁祸首可能是第二种情况下缺少for word in self.index
和if url not in self.index[keyword]
。没有它:
self.index[keyword]
from collections import defaultdict
def __init__(self, ...):
self.index = defaultdict(set)
# ...
def add_page_to_index(self, page):
for keyword in page.get_text().split():
self.add_to_index(keyword, page)
def add_to_index(self, keyword, page):
self.index[keyword].add(page)