我正在关注的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