Как обрабатывать большие двоичные файлы данных в Clojure? Предположим, что данные/файлы составляют около 50 МБ - достаточно малы для обработки в памяти (но не с наивной реализацией).Как обрабатывать большие двоичные данные в Clojure?
Следующий код корректно удаляет^M из маленьких файлов, но он бросает OutOfMemoryError
для больших файлов (как 6MB):
(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 массивы байтов не может рассматриваться как SEQ как это крайне неэффективна.
С другой стороны, решение с aset
, aget
и areduce
раздутое, некрасиво и необходимо, потому что вы не можете использовать библиотеку последовательности Clojure.
Что мне не хватает? Как обрабатывать большие двоичные файлы данных в Clojure?
Спасибо! Лень сделала трюк, как вы предложили. Подводя итог, обработка двоичных файлов в Clojure: ** Использование лени относительно легко и имеет низкий объем памяти, но он очень неэффективен CPU. Ключ должен никогда не реализовывать всю последовательность. ** Использование цикла/recur + aset/aget/areduce/amap является обязательным, имеет низкий объем памяти и намного быстрее. Это, вероятно, «правильный» способ сделать это. В моем конкретном случае, следует реализовать, как я предполагаю. – qertoip