如何處理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