April 11th, 2012

(no subject)

Еду на стачку в Ульяновск. Было бы здорово развиртуализироваться с френдами (если кто будет) и познакомиться с джекнайфовцами.

(no subject)

Прошу совета у знатоков Clojure.

Не могу прочитать большой (относительно, конечно) файл, примерно 5 миллионов строк.

Причем, если я его читаю просто в виде строк, то все ок:
(let [ll (time (read-file-lines "SCC.txt"))] (count ll))
"Elapsed time: 36599.499932 msecs"
5105043

А если каждую строку посте чтения я делю на слова и слова конвертирую в числа, то все заканчивается плохо:
(let [ll (time (read-edges "SCC.txt"))] (count ll))
OutOfMemoryError GC overhead limit exceeded
  java.lang.reflect.Method.copy (Method.java:143)

Вот так я читаю просто строки:
(defn read-file-lines [file]
  (reverse (read-file-with file '() cons)))

А вот так числа:
(defn read-edges [file]
  (read-file-with file '()
    (fn [line acc] (cons (line->numbers line) acc))))

(Т.е. при чтении под капотом одна и та же функция, которая принимает начальное значение аккумулятора и функцию для обновления аккумулятора, такой reduce на файле.)

Вот для полноты картины функция line->numbers:
(defn line->words [line]
  (clojure.string/split line #"\s"))

(defn line->numbers [line]
  (map #(Integer/parseInt %) (line->words line)))

Вопрос, собственно, классический: кто виноват и что делать?