-2

当我运行我的 ruby​​ 脚本时,这是一个很长的循环系列。对于每个循环,通过 nokogiri 解析一些随机的 html 文件。

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 回答