2015-10-22 55 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 

您還需要確保在鏈的最後一步中不再生成陣列。