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]
ファイルから2行目を読み取る前に、ストリームが閉じられているようです。興味深いことに、ファイルからのような行を手動で引き出すと(nth lines 200)
、multi-nth
呼び出しはすべての値<=200で機能します。
何が起こっているのか分かりますか?