2

私のアプリケーションは、潜在的に大きなテキストファイルを1行ずつ処理します。現在、私のコードは次のとおりです。

(with-open [r (clojure.java.io/reader "large_text_file")]
  (doall
    (map #(process %) (line-seq r)))

私のコードでは、すでに処理された行はメモリに残りますか?もしそうなら、どうすればそれを避けることができますか?

そして、一般的に、消費された怠惰なシーケンス要素はメモリに残りますか?

ありがとうございました!

4

4 に答える 4

3

StackOverflowの他の場所で詳細に説明されているように、通常のGCルールが適用されます。

したがって、シーケンスの先頭を保持するのではなく、要素が流れるときにのみ参照するようにしてください。

于 2012-06-09T04:04:43.027 に答える
2

doallを使用すると、seq の先頭が保持され、それが返されます。seq全体がメモリに常駐します。

副作用を行うために seq をトラバースすると仮定します。それが doseq の目的です:

(with-open [r (clojure.java.io/reader "your_large_file.txt")]
  (doseq [l (line-seq r)]
    (println l)))
于 2012-06-09T09:08:37.187 に答える
1

遅延シーケンスの評価を強制する必要があるが、それを保持する必要がない場合は、dorun を使用できます。doall と同じですが、nil を返し、シーケンス全体をメモリに保持しません。

フアン・マヌエル

于 2012-06-09T08:19:13.593 に答える
0

関数の戻り値は何をprocessもたらしますか?この方法で何かの大規模なコレクションを構築することになりますか?doseqマップとは異なり、価値のないもので処理できると思います。

于 2012-06-09T04:37:07.330 に答える