我正在学习 algo-class.org 课程,其中一项编程任务提供了一个格式如下的文件:
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。有没有其他方法可以降低内存?