2015-10-22 59 views
1

我正在使用Ruby的内置CSV解析器对大型文件。枚举器::懒惰和垃圾收集

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

我的问题是,当我实际上遍历散列数组时,垃圾收集器是否会在我去的时候真正清理它,或者只在整个数组可以清理时才会清理干净,基本上仍然允许记忆中的全部价值还在吗?

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

回答

1

当您迭代普通的旧数组时,垃圾收集器没有机会做任何事情。 在不再需要元素之后,可以通过将nil写入数组位置来帮助垃圾收集器,以便此位置中的对象现在可以自由收集。

如果您正确使用lazy枚举器,则不会迭代散列数组。相反,你可以枚举哈希值,一个接一个地处理,每一个都按需读取。

所以,你必须使用更少的内存的几率(取决于你进一步的处理,并且它不保存在内存中的对象反正)

结构可能看起来像这样:

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

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

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