0

我正在尝试使用字典为我的爬虫索引网页,并且遇到了一些有趣的内存问题。

我正在为索引创建一个字典(格式:关键字:[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)。这是我的代码有问题还是有其他解释?

请注意,我是一名高中生,因此我不一定具有最广泛的编程背景。

谢谢!

编辑:把它改成我原来的。

4

2 回答 2

0

两组代码之间的主要区别在于以下行,它仅出现在内存猪中:

if keyword in self.index:

在这种情况下,我的猜测self.index是相当大,self.index每次调用该方法时都必须检查是什么让你丧命。

您还应该考虑是否需要将收集的所有数据一次存储在解释器内存中。您可能最好将尽可能多的数据存储在某种更永久的结构中,例如 csv、redis 或类似的东西。

于 2012-12-26T03:55:47.520 回答
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)
于 2012-12-26T04:17:54.123 回答