我正在使用Ruby内置的CSV解析器来对抗大文件。
我的方法是将解析与其余逻辑分开。为了实现这一点,我正在创建一个哈希数组。我还想利用Ruby的Enumerator:: Lazy
来阻止将整个文件加载到内存中。
我的问题是,当我实际迭代哈希数组时,垃圾收集器是否实际上正在清理,或者它只在清理整个阵列时清理,基本上仍然允许记忆中的整个价值还在吗?
我不知道它是否会在我完成它时清理每个元素,只有在实际评估整个枚举之前它才会清理它。
答案 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
您还需要确保在链的最后一步中不再生成数组。