Ленивое извлечение строк из большого файла

Я пытаюсь получить 5 строк по номерам строк из большого файла (> 1 ГБ )с помощью Clojure. Я почти на месте, но вижу странные вещи и хочу понять, что происходит.

Пока у меня есть:

(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.

Есть идеи, что происходит?

7
задан David J. 16 August 2012 в 21:37
поделиться