我正在關注的algo-class.org過程時,它的編程任務之一提供如下格式的文件:內存不足錯誤處理Clojure中
1 2
1 5
2 535
...
有超過500萬這樣的行,我想讀取文件並將其轉換爲整數向量的矢量,如下所示:[[1 2] [1 5] [2 535] ...]。
(defn to-int-vector [s]
(vec (map #(Integer/parseInt %) (re-seq #"\w+" s))))
(def ints (with-open [rdr (clojure.java.io/reader "<file>")]
(doall (map to-int-vector (line-seq rdr)))))
所以我相信這樣,我沒有把整個文件放在內存中,只生成一個大整數向量。但是我從這裏得到OutOfMemoryError。我嘗試通過運行rand-int生成相同大小和相同格式的矢量,並且工作正常。
看起來內存問題是由臨時對象生成的? clojure處理這種情況的理想方式是什麼?
更新:
是的,我知道我是保存整個整數向量。我已經提高了堆的大小,現在它可以工作。我感興趣的是一個載體和500萬個元素(1000萬個整數)可以佔用如此多的內存 - 我必須爲jvm分配3g。有沒有其他方式可以減少記憶?
是的,vec和數組有助於減少內存。謝謝! – awh 2012-04-11 09:39:04
更新了我的答案 - 嘗試對數字對使用「int-array」或「short-array」而不是「to-array」。 – 2012-04-11 09:54:29