【问题标题】:Memory leak after algorithm in Rails?Rails中的算法后内存泄漏?
【发布时间】:2017-05-25 16:53:46
【问题描述】:

我写了一个算法,灵感来自合并排序的合并部分。

  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 本身有关。

【问题讨论】:

  • 你有输入示例吗?
  • 双重否定的意义何在? -(-arr.length/2)
  • @EricDuminil 它提供一个数组[[obj1], [obj2], [obj3]],其中对象是自定义对象
  • @sawa 不带功能的拿ceil只是个偷懒的办法。

标签: ruby algorithm memory-leaks garbage-collection


【解决方案1】:

Ruby 垃圾回收不会立即减少 Ruby 程序分配的内存量。内存分配很昂贵,因此即使您创建的对象立即被 GC 收集,内存也会慢慢释放回操作系统。如果您认为此函数存在内存泄漏,您应该尝试在非 Rails 进程中运行它,在该进程中您可以更好地控制对象生命周期。您可以使用GC.stat 获取有关运行 GC 之前和之后的活动对象和空闲对象数量的信息。我喜欢this article

【讨论】:

  • 哦,那真是太糟糕了。我想你是正确的。我必须一遍又一遍地调用GC.start,因为该算法为 GC 分配了太多内存,无法一次性释放它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多