我正在参加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。是否有其他方法可以降低内存使用率?
int-array
或short-array
替代to-array
来处理数字对。 - Marko Topolnik