これは、いくつかの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
'item_selector'の値に応じて、ツリー全体を' @ items'にして親スコープに戻しているかもしれません。 – Owen
サイドノート: '@items = @ items.map'は新しいオブジェクトを作成し、古いオブジェクトをメモリに保持します。 '@ items.map!'は同じオブジェクトを編集します(新しいオブジェクトもコピーもありません)。 – Myst
「[mcve]」をお読みください。不足している部分があるためコードを実行できませんし、解析するファイルの量もわかりませんが、一般的にメモリリークはNokogiriやRubyを扱う際の問題ではありません。あなたは解析するときに複数のページを表示しているように見えますが、入力データのサンプルが最小限でなければ、何が本当に起こっているのかわかりません。 –