Enumerator::Lazy 和垃圾收集

Enumerator::Lazy and Garbage Collection

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

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

我的问题是,当我实际遍历哈希数组时,垃圾收集器是实际清理我的东西还是只在可以清理整个数组时清理,基本上仍然允许内存中的整个值还在吗?

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

当你遍历一个普通的旧数组时,垃圾收集器没有机会做任何事情。 你可以在你不再需要该元素后,将 nil 写入数组位置来帮助垃圾收集器,这样这个位置的对象现在就可以自由收集了。

当您正确使用惰性枚举器时,您不会迭代哈希数组。相反,您枚举散列,一个接一个地处理,然后按需读取每个散列。

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

结构可能如下所示:

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

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

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