이것은 일부 html 페이지를 장식하고 긁어 모으는 파서이지만 가비지 수집되지 않는 많은 메모리를 먹습니다.루비 메모리 누수
결과를 양식에 전달합니다. 여기서 메모리 사용이 발생합니다.
이 코드에는 명백한 메모리 누수가 있습니까?
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를 다루는 데 문제가되지 않습니다. 구문 분석 할 때 여러 페이지를 표시하는 것처럼 보이지만 최소한의 입력 데이터 샘플이 없으면 실제로 어떤 일이 일어나는지 알 수 없습니다. –