Как обрабатывать большие двоичные файлы данных в Clojure? Предположим, что данные/файлы имеют размер около 50 МБ - достаточно мало для обработки в памяти (но не с наивной реализацией).
Следующий код правильно удаляет ^M из небольших файлов, но выдает OutOfMemoryError
для больших файлов (например, 6 МБ):
(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
Кажется, что массивы байтов Java нельзя рассматривать как последовательность, так как это крайне неэффективно.
С другой стороны, решения с aset
, aget
и areduce
раздуты, уродливы и императивны, потому что вы не можете использовать библиотеку последовательностей Clojure.
Что мне не хватает? Как обрабатывать большие двоичные файлы данных в Clojure?