いくつかの Clojure コードのストレス テストを行っているときに、大規模なデータ セットを反復処理しているときにヒープ領域が不足していることに気付きました。私は最終的に、Clojure のdoseq
機能と遅延シーケンスの実装の組み合わせに問題を突き止めることができました。
これは、使用可能なヒープ領域を使い果たして Clojure をクラッシュさせる最小限のコード スニペットです。
(doseq [e (take 1000000000 (iterate inc 1))] (identity e))
のドキュメントにdoseq
は、遅延シーケンスの先頭を保持しないことが明確に記載されているため、上記のコードのメモリの複雑さは O(1) に近いと予想されます。足りないものはありますか?非常に大きな遅延シーケンスを繰り返し処理する Clojure の慣用的な方法は何doseq
ですか?