我写了一个灵感来自合并排序合并部分的算法。
def self.merge(arr)
if arr.length == 1
return arr
end
groups = []
(0...-(-arr.length/2)).each do |i|
groups << []
if !arr[2*i+1].nil?
arr[2*i].each do |cal1|
arr[2*i+1].each do |cal2|
mergecal = func(cal1,cal2)
if mergecal
groups[i] << mergecal
else
mergecal = nil
end
end
end
else
groups[i] = arr[2*i]
end
end
arr = nil
return merge(groups)
end
渲染使用此算法的页面后,任务管理器报告大约500MB的RAM使用量。然后通过再次刷新同一页面,内存使用量现已达到1GB。我在函数调用之后尝试将GC.start(full_mark: true)
添加到控制器,但似乎没有任何改变。我不确定内存泄漏是否必须使用我的代码或Ruby本身进行编码。
答案 0 :(得分:0)
Ruby垃圾回收不会立即减少ruby程序分配的内存量。内存分配很昂贵,因此即使你创建的对象被GC立即收集,内存也会慢慢释放回操作系统。如果您认为此函数存在内存泄漏,则应尝试在非rails过程中运行它,在此过程中您可以更好地控制对象生命周期。您可以使用GC.stat获取有关运行GC之前和之后的实时和空闲对象数的信息。同样值得一读的是我喜欢ruby GC的工作方式this article。