Юрий Арапов (yuridichesky) wrote,
Юрий Арапов
yuridichesky

Прошу совета у знатоков 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)))

Вопрос, собственно, классический: кто виноват и что делать?
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 19 comments