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?