枚举器::懒惰和垃圾收集

时间:2015-10-22 20:18:34

标签: ruby enumerable

我正在使用Ruby内置的CSV解析器来对抗大文件。

我的方法是将解析与其余逻辑分开。为了实现这一点,我正在创建一个哈希数组。我还想利用Ruby的Enumerator:: Lazy来阻止将整个文件加载到内存中。

我的问题是,当我实际迭代哈希数组时,垃圾收集器是否实际上正在清理,或者它只在清理整个阵列时清理,基本上仍然允许记忆中的整个价值还在吗?

我不知道它是否会在我完成它时清理每个元素,只有在实际评估整个枚举之前它才会清理它。

1 个答案:

答案 0 :(得分:1)

当你遍历一个普通的旧数组时,垃圾收集器没有机会做任何事情。 在不再需要元素之后,可以通过将nil写入数组位置来帮助垃圾收集器,以便此位置的对象现在可以免费收集。

正确使用延迟枚举器时,不会迭代哈希数组。相反,您枚举哈希值,一个接一个地处理,并按需读取每个哈希值。

所以你有机会使用更少的内存(取决于你的进一步处理,并且它不会将对象保存在内存中)

结构可能如下所示:

enum = Enumerator.new do |yielder|
  csv.read(...) do
     ...        
     yielder.yield hash
  end
end

enum.lazy.map{|hash| do_something(hash); nil}.count

您还需要确保在链的最后一步中不再生成数组。