2016-08-04 1 views
0

이것은 일부 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 
+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'으로 다운 그레이드 고정.

메모리 누수 버그 또는 메모리 팽창 여부는 확실하지 않습니다. 어쨌든이 조합은 메모리 금지입니다.

이 방법은 다음과 같습니다

  • 되지 않음 사용 푸마 (에 WEBrick 또는 유니콘은 루비 2.3.1하지이 문제가) 루비 2.0.0

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

  • 다운 그레이드를
  • +0

    BTW, Nokogiri, Imagemagic, fog gems와 관련이 없습니다. 단, 내 코드는 메모리 집약적이며 한 번에 많은 페이지를 가져 오는 것입니다. –

    +1

    메모리의 페이지에서 데이터를 집계합니다. 한 페이지 만 수행하면 사이트가되거나 여러 사이트가있는 경우 똑똑하지 않습니다. 백킹 데이터베이스를 사용하여'collection' 대신에 캡쳐중인 정보를 저장하십시오. 심지어 디스크상의 SQLite DB도이를 가능하게합니다. Sequel ORM을 사용하면 작업하기가 정말 쉽습니다. http://sequel.jeremyevans.net/rdoc/files/README_rdoc.html#label-Getting+Started를 참조하십시오. Puma와 Unicorn은 서버이므로 문제와 관련이 없으며 Ruby 버전도 문제가 아닙니다. –

    +0

    @ theTinMan 고맙습니다. 당신 말이 맞아요. 그러나이 유스 케이스에는 웹 서버가 필요하므로 Nokogiri가 아니라 Parser 프로세스가 문제입니다. 그것은 어떤 webapp를 제시하는 버그 (또는 문제)입니다. 나는 그것이 긁기와 관련이 있다고 생각했지만, 그렇지 않았다. –