this SO threadには、大規模なコレクションにseq
への参照を保存すると、コレクション全体がガベージコレクションされないことが分かりました。Clojureで `seq`を使うのはいつか?
最初に、そのスレッドは2009年です。これは「現代の」Clojure(v1.4.0またはv1.5.0)ではまだ当てはまりますか?
第2に、この問題はレイジーシーケンスにも当てはまりますか?たとえば、(def s (drop 999 (seq (range 1000))))
は、ガベージコレクタがシーケンスの最初の999
要素をリタイアできるようにしますか?
最後に、大きなコレクションでこの問題を回避する方法はありますか?言い換えれば、例えば、1000万要素のベクトルがあれば、消費された部分がガベージコレクションされるような方法でベクトルを消費することができますか? 1000万要素のハッシュマップがあったらどうなりますか?
私はかなり大きなデータセットで操作しているので、不要なオブジェクトをガベージコレクションできるように、オブジェクトへの参照を保持しないように注意する必要があります。その通りですが、場合によってはjava.lang.OutOfMemoryError: GC overhead limit exceeded
エラーが発生します。
@cgrandの例 '(drop 999990(vec(range 1000000)))'は、介在するベクトルと 'subvec'toringの振る舞いによるものだと思います。私は怠惰な 'cons'edシーケンスがこれをするだろうとは思わない。サブベクトルを保持したままベクターを解放する必要がある場合は、サブベクトルを新しいベクターにコピーすることができます。非常に興味深い質問ですが、私も答えを見るのを待っています! –