Sto cercando di prendere 5 righe con i loro numeri di riga da un file di grandi dimensioni (> 1 GB) con Clojure. Sono quasi arrivato ma vedo cose strane e voglio capire cosa sta succedendo.Estrarre tranquillamente le righe dal file di grandi dimensioni
Finora ho ottenuto:
(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))))
Ora, (read-lines "my-file" [0])
opere senza un problema. Tuttavia, passando [0 1]
mi dà il seguente stacktrace:
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]
Sembra che il flusso è stato chiuso prima di poter leggere la seconda riga dal file. È interessante notare che se estraggo manualmente una riga dal file con qualcosa come (nth lines 200)
, la chiamata multi-nth
funziona per tutti i valori < = 200.
Qualche idea su cosa sta succedendo?
Buon punto. Avrò bisogno di utilizzare chiamate di metodo di accesso casuale Java di livello inferiore per farlo bene? –
Penso che si possa ottenere un codice decente utilizzando il map-indexed e il filtro. Aggiornerò tra un minuto ... –
Ah ok, è grandioso. Se è sintatticamente più brutto di quanto vorresti, puoi usare keep-indexed ed eventualmente condensare la funzione filtro. Guardando dentro ora ... –