我试图用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
调用适用于所有值< = 200.
任何想法发生了什么?
好一点。我是否需要使用较低级别的Java随机访问方法调用才能正确使用它? – 2012-08-16 22:40:34
我认为你可以使用map-indexed和filter来获得非常清晰的代码。我会在一分钟内更新... – 2012-08-16 22:42:27
啊好吧,那太好了。如果它在语法上比你想要的更丑,你可以使用保持索引并可能压缩过滤器函数。现在看看它... – 2012-08-16 23:23:00