Как обрабатывать большие двоичные данные в Clojure?

Как обрабатывать большие двоичные файлы данных в 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?

6
задан Isaac 21 August 2010 в 23:32
поделиться