У меня есть файл журнала размером 1,6 ГБ, содержащий 2 миллиона записей. Я читаю содержимое журнала в канал, выполняю некоторые преобразования и записываю содержимое обратно в другой канал.
Наконец, я записываю содержимое второго канала в файл.
Мой код работает нормально, и результаты соответствуют ожиданиям. Однако вся операция занимает ~45 секунд, что слишком долго.
Мне нужно сократить время.
(def reader-channel (delay (let [temp (chan)]
(go
(with-open [reader (clojure.java.io/reader "My_Big_Log")]
(doseq [ln (line-seq reader)]
(>! temp ln)))
(close! temp))
temp)))
(def writer-channel (chan))
(defn make-collection [] (loop [my-coll []] (let [item (<!! @reader-channel)]
(if (nil? item)
my-coll
(do (let [temp (re-find #"[a-z]+\.[a-z]+\.[a-z]+" item)]
(recur (conj my-coll temp))))))))
(def transformed-collection (delay (partition-by identity
(remove nil? (sort (make-collection))))))
(defn transform [] (go-loop [counter 0]
(if (>= counter (count @transformed-collection))
(do (close! writer-channel)
(println "Goodbye"))
(do (let [item (str "Referrer " (+ counter 1) ": "
(first (nth @transformed-collection counter)))]
(>! writer-channel item))
(let [item (str "Number of entries associated with this referrer: "
(count (nth @transformed-collection counter)))]
(>! writer-channel item))
(recur (inc counter))))))
(defn write-to-file [] (with-open [wrtr (clojure.java.io/writer "Result.txt" :append true)]
(loop []
(when-let [temp (<!! writer-channel)]
(.write wrtr (str temp "\n"))
(recur)))))
Прошу прощения за неправильный отступ и форматирование.