如何处理Clojure中的大型二进制数据文件?我们假设数据/文件大约为50MB--足够小,可以在内存中处理(但不是天真的实现)。如何在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中处理二进制文件: **使用懒惰相对比较简单,并且占用的内存很少,但是它非常低效。关键是永远不会意识到整个序列。 **使用循环/ recur + aset/aget/areduce/amap势在必行,内存占用少且速度更快。这可能是做到这一点的“正确”方式。在我的具体情况下,我应该实施一些举措。 – qertoip 2010-08-22 08:22:04