這是一個解析器,它可以創建一些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來說並不是問題。在解析時,您似乎在拉動多個頁面,但沒有最小的輸入數據樣本,我們無法確定發生了什麼。 –