0

辞書を使用してクローラーの Web ページのインデックスを作成しようとしていますが、いくつかの興味深いメモリの問題が発生しています。

どのページにどの単語が含まれているかを追跡するために使用するインデックス (形式: キーワード:[url1, url2, url3, ...]) 用の辞書を作成しています。Web ページを収集するときは、関数 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

2 番目のケースでは、 for word in self.indexandが存在しないことが原因である可能性があります。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 に答える
0

2 つのコード セットの主な違いは、メモリ ホグにのみ表示される次の行です。

if keyword in self.index:

この場合の私の推測では、それself.indexは非常に大きく、self.indexメソッドが呼び出されるたびにチェックしなければならないことがあなたを殺しています。

また、収集しているすべてのデータを一度にインタープリターのメモリに格納する必要があるかどうかも調べる必要があります。csv、redis、またはそのようなものなど、ある種のより永続的な構造にできるだけ多くのデータを保存することをお勧めします。

于 2012-12-26T03:55:47.520 に答える