ruby脚本内存消耗持续上升…有什么方法可以防止这种情况?

ruby脚本内存消耗持续上升…有什么方法可以防止这种情况?,ruby,nokogiri,Ruby,Nokogiri,当我运行ruby脚本时,它是一个非常长的循环序列。对于每个循环,通过nokogiri解析一些随机html文件 top显示内存消耗%通过0.1递增,cpu使用率每隔几秒递增一次 最终,由于“内存不足”,ruby脚本崩溃 更新至最新版本: def extract(newdoc, newarray) doc = Nokogiri::HTML(newdoc) collection = '' collection = newarray.map {|s| doc.xpath(s)} dd = ""

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

top显示内存消耗%通过0.1递增,cpu使用率每隔几秒递增一次

最终,由于“内存不足”,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

我不太明白你是怎么把你的收藏品循环起来的。我将改写如下:

collection.each do |coll_of_fields|
  coll_of_fields.each do |field|
    spliceElement(field, dd)
  end
  newrow = dd.chop() + "\n" 
end
现在您似乎假设每个数组中的元素数至少与第一个数组中的元素数相同。为什么不先循环所有行,然后循环一行中的所有元素

另外,
returnnewrow
对我来说不是很清楚吗?在通过外部循环的第一次迭代后停止

为什么不在传递参数的原始数组中使用
/html/body/h1/text()


然后您的元素可以直接处理字符串。还是我遗漏了什么?

基于您的其他问题,我想知道您是在保存
extract
的值,还是以其他方式保留对
集合的引用。我想你每次都想重新开始

无论如何,在你的其他问题中,似乎仍有一些编辑。在两个周期之间,您肯定应该将不希望保留的任何内容设置为零


如果这还不够好,您可能需要通过逻辑进行某种二进制搜索,并在一组聚合的编辑测试运行中禁用一半程序,直到您看到内存丢失发生的位置。

您可以在每次提取后调用
GC.start
,明确启动垃圾收集并清理未使用的内存。

您已经发布了三次这个问题,标题和文本略有不同。这不会给你更好的帮助。你有没有检查我对你的一个问题的回答?你的意思是我应该在返回之前设置collection=nil吗?在definitionextract()的开头设置collection=nil,我用我现在拥有的更新了它。内存%使用率仍在不断上升,即使我已将不想保留的内容设置为零。