【发布时间】:2012-08-13 07:30:24
【问题描述】:
我正在尝试使用 Clojure 从一个大 (> 1GB) 文件中按行号获取 5 行。我快到了,但看到一些奇怪的东西,我想了解发生了什么。
到目前为止,我得到了:
(defn multi-nth [values indices]
(map (partial nth values) indices))
(defn read-lines [file indices]
(with-open [rdr (clojure.java.io/reader file)]
(let [lines (line-seq rdr)]
(multi-nth lines indices))))
现在,(read-lines "my-file" [0]) 可以正常工作。但是,传入[0 1] 会给我以下堆栈跟踪:
java.lang.RuntimeException: java.io.IOException: Stream closed
Util.java:165 clojure.lang.Util.runtimeException
LazySeq.java:51 clojure.lang.LazySeq.sval
LazySeq.java:60 clojure.lang.LazySeq.seq
Cons.java:39 clojure.lang.Cons.next
RT.java:769 clojure.lang.RT.nthFrom
RT.java:742 clojure.lang.RT.nth
core.clj:832 clojure.core/nth
AFn.java:163 clojure.lang.AFn.applyToHelper
AFn.java:151 clojure.lang.AFn.applyTo
core.clj:602 clojure.core/apply
core.clj:2341 clojure.core/partial[fn]
RestFn.java:408 clojure.lang.RestFn.invoke
core.clj:2430 clojure.core/map[fn]
似乎在我从文件中读取第二行之前,流已被关闭。有趣的是,如果我用(nth lines 200) 之类的内容手动从文件中拉出一行,multi-nth 调用适用于所有值
知道发生了什么吗?
【问题讨论】:
标签: clojure lazy-evaluation stream-processing