¿Cómo se procesan los archivos de datos binarios grandes en Clojure? Supongamos que los datos/archivos son de aproximadamente 50 MB, lo suficientemente pequeños como para procesarse en la memoria (pero no con una implementación ingenua).¿Cómo procesar datos binarios grandes en Clojure?
El siguiente código elimina correctamente^M a partir de archivos pequeños pero lanza OutOfMemoryError
para archivos más grandes (como 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
Parece que Java matrices de bytes no pueden ser tratados como SEQ ya que es extremadamente ineficiente
Por otro lado, las soluciones con aset
, aget
y areduce
son hinchadas, feas e imperativas porque no se puede usar realmente la biblioteca de secuencias de Clojure.
¿Qué me estoy perdiendo? ¿Cómo se procesan los archivos de datos binarios grandes en Clojure?
Gracias! La pereza hizo el truco como sugirió. Para resumir, procesar archivos binarios en Clojure: ** Usar la pereza es relativamente fácil y tiene una huella de memoria baja, pero es muy ineficiente en la CPU. La clave es nunca darse cuenta de la secuencia completa. ** El uso de loop/recur + aset/aget/areduce/amap es imprescindible, tiene un espacio de memoria bajo Y es mucho más rápido. Esta es probablemente la forma "correcta" de hacerlo. En mi caso particular, uno debería implementar areduce, supongo. – qertoip