-2

非常に長い一連のループである Ruby スクリプトを実行すると。ループごとに、ランダムな html ファイルが nokogiri を介して解析されます。

top は、メモリ消費率が数秒ごとに CPU 使用率とともに 0.1 ずつ増加していることを示しています。

最終的に「メモリ不足」が原因で ruby​​ スクリプトがクラッシュする

最新に更新:

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
4

3 に答える 3

1

extract他の質問に基づいて、 の値を保存しているのか、それとも他の方法で への参照を保持しているのか疑問に思っていますcollection。毎回それでやり直したいと思いますか?

いずれにせよ、あなたの他の質問では、まだいくつかの編集があるようです. 保持したくないものは、サイクル間で nil に設定する必要があります。

それが十分でない場合は、ロジックを介して一種のバイナリ検索を実行し、メモリ損失が発生している場所がわかるまで、編集とテストの実行の収束セットでプログラムの半分を無効にする必要がある場合があります。

于 2009-11-27T06:04:48.547 に答える
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 は文字列で直接機能する可能性があります。それとも私は何かを逃していますか?

于 2009-11-26T12:21:11.830 に答える
0

各抽出後に呼び出しGC.startて、ガベージ コレクションを明示的に開始し、未使用のメモリをクリーンアップすることができます。

于 2009-11-27T11:53:40.160 に答える