Clojure - 消耗懒惰的序列元素会留在内存中吗?

时间:2012-06-09 04:03:24

标签: java clojure

我的应用程序逐行处理一个可能很大的文本文件,我的代码目前是:

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

在我的代码中,已经处理过的行会留在内存中吗?如果是这样,我该如何避免呢?

一般来说,消耗的懒惰序列元素会留在内存中吗?

谢谢!

4 个答案:

答案 0 :(得分:3)

取决于:正常的GC规则适用,如elsewhere on StackOverflow in great detail所述。

所以,确保你只引用元素,而不是按住序列的头部,你应该是好的。

答案 1 :(得分:2)

使用doall将保留seq的头部并将其返回。 整个 seq将驻留在内存中。

我假设你遍历副作用的seq。这就是剂量的目的:

(with-open [r (clojure.java.io/reader "your_large_file.txt")]
  (doseq [l (line-seq r)]
    (println l)))

答案 2 :(得分:1)

如果您需要强制评估延迟序列但不需要保留它,则可以使用dorun。它与doall相同但返回nil并且不会将整个序列保存在内存中。

Juan Manuel

答案 3 :(得分:0)

函数process的返回值是多少?你会以这种方式建立大量的东西吗?我认为你可以用doseq来处理它,它不会产生任何价值,这与map不同。