Ich versuche Clojures core.async
-Bibliothek zu verwenden, um Zeilen aus einer Datei zu verarbeiten/zu verarbeiten. Wenn mein Code ausgeführt wird, wird IOException: Stream closed
geworfen. Nachfolgend finden Sie eine REPL Sitzung, die das gleiche Problem wie in meinem Code reproduziert:Dateiinhalte mit Clojures core.async konsumieren
(require '[clojure.core.async :as async])
(require '[clojure.java.io :as io])
; my real code is a bit more involved with calls to drop, map, filter
; following line-seq
(def lines
(with-open [reader (io/reader "my-file.txt")]
(line-seq reader)))
(def ch
(let [c (async/chan)]
(async/go
(doseq [ln lines]
(async/>! c ln))
(async/close! c))
c))
; line that causes the error
; java.io.IOException: Stream closed
(async/<!! ch)
Seit seiner ist mein erstes Mal tut so etwas wie dieses (async + Datei) funktionieren sollte, vielleicht habe ich einige falsche Vorstellungen darüber, wie es. Kann jemand klären, welcher Ansatz für das Senden von Dateizeilen in eine Kanalleitung geeignet ist?
Danke!
Ich sehe ... Ich wollte vermeiden, den gesamten Inhalt der Datei auf einmal in Speicher zu laden, weil es ein großer sein kann. Deshalb habe ich über die Verwendung von with-open/line-seq combo nachgedacht. Kann ich angesichts dieser Einschränkung (Dateigröße) etwas tun? –