在this SO thread中,我瞭解到在大集合上保留對seq
的引用將會阻止整個集合被垃圾收集。什麼時候應該避免在Clojure中使用`seq`?
首先,線程是從2009年開始這是在「現代」的Clojure(V1.4.0或V1.5.0)仍然如此?
其次,這個問題是否也適用於懶序列?例如,(def s (drop 999 (seq (range 1000))))
會允許垃圾收集器退出序列的第一個999
元素嗎?
最後,有沒有一個很好的解決大集合這個問題的方法?換句話說,如果我擁有一千萬個元素的矢量,我是否可以消耗這個矢量,使得所消耗的部分可以被垃圾收集?如果我有一個包含1000萬個元素的散列圖,那麼呢?
的原因,我問的是,我的工作相當大的數據集,而我不得不更加小心不要保留對象的引用,讓我不需要的對象可以被垃圾收集。事實上,在某些情況下,我遇到java.lang.OutOfMemoryError: GC overhead limit exceeded
錯誤。
我想@ cgrand的例子'(drop 999990(vec(range 1000000))''是由於介入向量和'subvec'toring的行爲。我不懷疑一個懶惰的「缺點」序列會這樣做。如果您需要在保留子向量的同時釋放向量,則可以將子向量'複製到新向量中。非常有趣的問題,但我還在等待看到答案! – 2013-02-21 17:03:48