2016-08-04 25 views
0

これは、いくつかのHTMLページを宝石にしてそれらを擦るパーサーですが、ガベージコレクションされていない多くのメモリを消費します。Rubyのメモリリーク

結果をフォームに渡します。ここではメモリ使用量が発生します。

このコードに明らかなメモリリークはありますか?

def scrape(urls, item_selector) 
    collection = [] 
    urls.each do |url| 
     open(url) do |conn| 
     doc = Nokogiri::HTML(conn.read) # Opens URL 
     @items = doc.css(item_selector)#[0..1] # Sets items 
     @items = @items.map {|item| item['href']} 
     @items.map{|item| Addressable::URI.parse(item).normalize } 
     @items.map{|item| absolute_url(url, item) } 
     @items.each do |item| 
      open(item) do |connect| 
      page = Nokogiri::HTML(connect.read) 
      collection << { 
       :url  => item, 
       :title => get_title(page), 
       :price => get_price(page), 
       :image_url => get_image(page) 
      } 
      end # end connect 
     end # end items 
     end # end conn 
    end #end urls 
    collection 
    end 
+0

'item_selector'の値に応じて、ツリー全体を' @ items'にして親スコープに戻しているかもしれません。 – Owen

+1

サイドノート: '@items = @ items.map'は新しいオブジェクトを作成し、古いオブジェクトをメモリに保持します。 '@ items.map!'は同じオブジェクトを編集します(新しいオブジェクトもコピーもありません)。 – Myst

+0

「[mcve]」をお読みください。不足している部分があるためコードを実行できませんし、解析するファイルの量もわかりませんが、一般的にメモリリークはNokogiriやRubyを扱う際の問題ではありません。あなたは解析するときに複数のページを表示しているように見えますが、入力データのサンプルが最小限でなければ、何が本当に起こっているのかわかりません。 –

答えて

0

この問題は、Puma + Ruby> = 2.1.xによるものでした。ルビー「2.0.0」にダウングレードしました。

メモリが不足しているか、メモリが膨れているかどうかは不明です。とにかく、この組み合わせはメモリが大変です。

2の方法は、以下のとおりです。

  • は、Ruby 2.0.0

https://github.com/puma/puma/issues/342

にプーマ(WEBrickにまたはユニコーンはRubyの2.3.1で、この問題ではない持っている)
  • ダウングレードを使用しません
  • +0

    ところで、ノコギリ、イマージマジック、フォグの宝石に関係するものは何もありませんが、私のコードはメモリを大量に消費し、一度に多くのページを取得します。 –

    +1

    メモリ内のページからデータを集計しています。あなたが1つのことになるいくつかのページだけをしているが、サイトや複数のサイトを行っている場合、それは賢明ではない。バッキングデータベースを使用して、 'collection'ではなくcaptureしている情報を保存します。ディスク上のSQLite DBでもこれが可能です。 Sequel ORMを使用すると、操作が簡単になります。 http://sequel.jeremyevans.net/rdoc/files/README_rdoc.html#label-Getting+Startedを参照してください。 PumaとUnicornはサーバーなので問題には関係しませんし、Rubyのバージョンも問題ではありません。 –

    +0

    @theTinManありがとうございます。あなたが正しいです。しかし、このユースケースにはWebサーバーが必要です.Nokogiriではなく、これが問題です。パーサープロセスもありません。それはバグ(または問題)のwebappを提示しています。私はそれが掻爬に関連していると思ったが、そうではない。 –