2009-11-27 4 views
-2

나는 매우 긴 일련의 루프 인 내 루비 스크립트를 실행한다. 각 루프에 대해 임의의 html 파일이 nokogiri를 통해 구문 분석됩니다.루비 스크립트 메모리 % 소비가 계속 ... 이것을 막는 방법은 무엇입니까?

top은 메모리 소비 %가 0.1 초를 통해 CPU 사용량과 함께 몇 초마다 증가한다는 것을 나타냅니다.

결국 루비 스크립트로 인해 "메모리가 부족합니다"최신으로 업데이트

에 충돌 :

def extract(newdoc, newarray) 
doc = Nokogiri::HTML(newdoc) 
collection = '' 
collection = newarray.map {|s| doc.xpath(s)} 
dd = ""; 


(0...collection.first.length).each do |i| 
    (0...collection.length).each do |j| 
     dd += collection[j][i].to_s 
    end 
end 
collection = '' 
newarray = '' 
doc = '' 
puts dd.chop + "\n" 

end 

for 1..100000 
extract("somerandomHTMLfile", ["/html/body/p", "/html/body/h1"]) 
end 
+5

약간 다른 제목과 텍스트로이 질문을 세 번 게시했습니다. 그게 너에게 더 도움이되지 않을거야. –

+0

질문에 내 대답을 확인 했습니까? http://stackoverflow.com/questions/1802435/ruby-script-runs-out-of-memory – nathanvda

답변

1

내가 아주 이해가 안 돼요 어떻게 컬렉션을 통해 루프. 다음과 같이 나는이를 다시 작성합니다 :

collection.each do |coll_of_fields| 
    coll_of_fields.each do |field| 
    spliceElement(field, dd) 
    end 
    newrow = dd.chop() + "\n" 
end 

이제 첫 번째 배열의 각 배열의 이상과 같은 많은 요소가 될 것이라고 가정 할 것으로 보인다. 왜 모든 행을 반복하고, 그 다음에 모든 요소를 ​​반복하지 않습니까?

return newrow도 분명하지 않습니다. 외부 루프를 통해 첫 번째 반복을 마친 후 중지 하시겠습니까?

매개 변수를 전달하는 원래 배열에 /html/body/h1/text()을 사용하지 않으시겠습니까?

그러면 spliceElement가 문자열에서 직접 작동 할 수 있습니다. 아니면 뭔가 빠졌나요?

1

귀하의 다른 질문에 따라 extract 값을 저장하고 있는지 또는 다른 방법으로 collection 참조를 보유하고 있는지 궁금합니다. 나는 그 때마다 다시 시작하기를 원합니까?

어쨌든 다른 질문에서 여전히 약간의 편집이있는 것으로 보입니다. 주기간에 유지하지 않으려는 항목은 반드시 설정해야합니다.

충분하지 않다면 논리를 통해 일종의 바이너리 검색을 수행하고 메모리 손실이 발생하는 곳을 확인할 때까지 편집 테스트 실행의 수렴 집합에서 프로그램의 절반을 비활성화해야 할 수 있습니다.

+0

반환하기 전에 collection = nil을 설정해야한다는 의미입니까? 정의 시작 부분에 collection = nil을 설정합니다. extract() – joeyaa

+0

지금 가지고있는 것으로 업데이트했습니다. 메모리 % 사용량은 계속 증가하지만 사이클링을 유지하지 않으려는 내용을 설정해도 계속 증가합니다. – joeyaa

0

각 추출 후에 GC.start을 호출하여 명시 적으로 가비지 수집을 시작하고 사용하지 않은 메모리를 정리할 수 있습니다.

관련 문제