2

私は10k +ページに行き、そこからデータをスクレイプするスクレイパーに取り組んできました。閉じる/終了してもセレンはメモリを解放しません

問題は、時間の経過と共にメモリ消費が大幅に増加することです。したがって、スクラップ終了時にのみドライバインスタンスを閉じる代わりにこれを克服するために、スクレイパーは更新され、すべてのページがロードされ、データが抽出された後にインスタンスを閉じます。

しかし、何らかの理由でRAMメモリにデータが残っています。

PhantomJSを使用しようとしましたが、何らかの理由でデータが正しく読み込まれませんでした。 私はまた、Firefoxのキャッシュを100MBに制限するためのスクレイパーの初期バージョンで試してみましたが、これもうまくいきませんでした。

注:chromedriverとfirefoxの両方のインスタンスでテストを実行します。残念ながら、セレンの代わりにリクエストや機械化などのライブラリを使用することはできません。

私は今一週間これを把握しようとしているので、何か助けに感謝します。ありがとう。

答えて

1

あなたのドライバはあなたの記憶を埋めるものだと言っていますか?どのように閉じていますか?あなたのデータを抽出している場合は、それらをメモリに保存しているコレクションへの参照がまだありますか?

スクラップの終了時にドライバインスタンスを閉じたときにメモリが不足していると言われました。余分な参照を保持しているように見えます。

+0

ドライバがメモリアップを充填されたようにはい、それはそうです。私はセレンが使われる5つの機能を持っています。私はScrapyと一緒にセレンを使用します。だから、私はちょうど新しいドライバのインスタンスをインスタンス化するそれらの関数では、関数のニアエンドで私はdriver.quit()またはdriver.close()を呼び出します。余分な参照を保持するために、私は私が行うことを確認していない。私はページを読み込むためにセレンを使用し、一旦ロードすると、page_sourceをScrapyセレクターに入れます。私はScrapyにメモリリークはありません。 – ScrapyNoob

+0

[memory_profiler](https://pypi.python.org/pypi/memory_profiler)を使用して、行ごとのメモリ使用量をチェックすることができます。これは、どのセクションがあなたの記憶を消費しているかをよりよく理解するのに役立ちます。そこに何かを見つけることができない場合は、ここにサンプル関数を投稿すると役に立つかもしれません。 – abrarisme

1

The only way強制的にPythonインタプリタがメモリをOSに解放するのは、プロセスを終了することです。したがって、multiprocessingを使用してSelenium Firefoxインスタンスを生成します。生成されたプロセスが終了したときにメモリが解放されます。

import multiprocessing as mp 
import selenium.webdriver as webdriver 

def worker() 
    driver = webdriver.Firefox() 
    # do memory-intensive work 
    # closing and quitting is not what ultimately frees the memory, but it 
    # is good to close the WebDriver session gracefully anyway. 
    driver.close() 
    driver.quit() 

if __name__ == '__main__': 
    p = mp.Process(target=worker) 
    # run `worker` in a subprocess 
    p.start() 
    # make the main process wait for `worker` to end 
    p.join() 
    # all memory used by the subprocess will be freed to the OS 

も参照してくださいWhy doesn't Python release the memory when I delete a large object?

関連する問題