因为我运行我的ruby脚本,这是一个很长的循环系列。对于每个循环,一些随机的html文件通过nokogiri进行解析。
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
答案 0 :(得分: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 :(得分:1)
根据您的其他问题,我想知道您是保存extract
的值,还是以其他方式保留对collection
的引用。我想你每次都要重新开始吗?
无论如何,在你的其他问题中,似乎还有一些编辑。你肯定应该把你不想保留的任何东西设置为在循环之间为零。
如果这还不够好,您可能需要通过逻辑进行一种二进制搜索,并在一组融合的编辑测试运行中禁用一半程序,直到您看到发生内存丢失的位置。
答案 2 :(得分:0)
您可以在每次提取后调用GC.start
,以显式启动垃圾回收并清理未使用的内存。