Como processar grandes dados binários no Clojure?

Como se processa grandes arquivos de dados binários no Clojure? Vamos supor que os dados / arquivos tenham cerca de 50 MB - pequenos o suficiente para serem processados na memória (mas não com uma implementação ingênua).

O código a seguir remove corretamente ^ M de arquivos pequenos, mas lançaOutOfMemoryError para arquivos maiores (como 6 MB):

(defn read-bin-file [file]
  (to-byte-array (as-file file)))

(defn remove-cr-from-file [file]
  (let [dirty-bytes (read-bin-file file)
        clean-bytes (filter #(not (= 13 %)) dirty-bytes)
        changed?    (< (count clean-bytes) (alength dirty-bytes))]    ; OutOfMemoryError
    (if changed?
      (write-bin-file file clean-bytes))))    ; writing works fine

Parece queMatrizes de bytes Java não podem ser tratadas como seq como é extremamente ineficiente.

Por outro lado, soluções comaset, aget eareduce são inchados, feios e imperativos, porque você realmente não pode usar a biblioteca de sequências Clojure.

o que estou perdendo?Como se processa grandes arquivos de dados binários no Clojure?

questionAnswers(1)

yourAnswerToTheQuestion