我的应用程序逐行处理一个可能很大的文本文件,我的代码目前是:
(with-open [r (clojure.java.io/reader "large_text_file")]
(doall
(map #(process %) (line-seq r)))
在我的代码中,已经处理过的行会留在内存中吗?如果是这样,我该如何避免呢?
一般来说,消耗的懒惰序列元素会留在内存中吗?
谢谢!
答案 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不同。