Ошибка OutOfMemory при обработке большого файла в Clojure

Я следую курсу algo -class.org, и одно из его заданий по программированию предоставляет файл с формат, как показано ниже:

1 2
1 5
2 535

...

Есть более 5 миллионов таких строк, я хочу прочитать в файле и преобразовать его в вектор целочисленного вектора, как этот :[[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 справиться с таким случаем?

Обновление:

да, я понимаю, что держу весь целочисленный вектор. Я увеличил размер кучи, и теперь он работает. Мне интересно, что вектор и 5 миллионов элементов (10 миллионов целых чисел )могут занимать столько памяти --, что мне приходится выделять 3g для jvm.Есть ли другой способ, который уберет память?

5
задан awh 11 April 2012 в 08:11
поделиться