2009-06-27 8 views
11

En java leería todo el archivo en la matriz de bytes y haré algunos procesamientos con ella. Ahora quiero implementar el mismo algoritmo en clojure.Clojure que representa la matriz de bytes

Lo que me pregunto es ¿puedo usar una lista en lugar de una matriz?

Sé que puedo crear una matriz desde clojure, pero ¿cuál es la forma de lisp de manejar esto?

Respuesta

11

Si el archivo en cuestión es muy grande, siempre debe considerar el uso de un archivo mapeado en la memoria. clojure.contrib.mmap ofrece algunas funciones para lidiar con eso.

Sé que puedo crear una matriz de clojure, pero ¿cuál es la forma de lisp de manejar esto?

No sé por la forma en Lisp, pero la forma en Clojure le permite utilizar las funciones de secuencia de matrices, por lo que no tiene que decidir entre la representación eficiente y cómoda manipulación (que en mi opinión es uno de los puntos que hace que Clojure sea tan pragmático).

+0

Los archivos que voy a leer son pequeños. 200-300 Kb's máx. –

+0

Luego, simplemente cree la matriz como lo haría en Java y use las funciones de Clojure que acepten un seqable, que funciona mágicamente con las matrices. Para cualquier otro consejo, puede mencionar qué es exactamente lo que necesita hacer con el contenido. Dado que está utilizando una matriz de bytes, supongo que necesita hacer cosas binarias, en cuyo caso es posible que desee leer el siguiente artículo, que ilustra algunos patrones agradables para usar: http://gnuvince.wordpress.com/ 2009/01/29/reading-binary-data-in-clojure / – pmf

3

aquí hay una secuencia perezosa de los bytes en el archivo y cierra el identificador del archivo cuando se ha leído el último byte. Si trabajas con secuencias alimentadas por archivos de gran tamaño, ten cuidado de no mantenerte en la cabecera de la secuencia en ningún lugar o te quedarás sin memoria. Sin embargo, puedes sujetar el controlador del archivo en caso de que necesites cerrarlo manualmente en una condición de error.

 
(defn byte-seq [rdr] 
    (let [result (. rdr read)] 
    (if (= result -1) 
     (do (. rdr close) nil) 
     (lazy-seq (cons result (byte-seq rdr)))))) 
Cuestiones relacionadas