Я не люблю кодировать гольф, но кажется, что это довольно просто. Мы хотим посчитать частоту реферера, поэтому давайте просто сделаем это:
(with-open [reader (clojure.java.io/reader "My_Big_Log")]
(frequencies
(map #(re-find #"[a-z]+\.[a-z]+\.[a-z]+")
(line-seq reader))))
Подсчет рефереров путем генерации списка из всех 2 миллионов из них, а затем сортировки и разбиения означает, что вы переносите большое количество ненужных данных. Это делает это в сложности пространства O (источники), а не O (строки), что в зависимости от ваших журналов может быть огромным сокращением.
Мне также не ясно, почему вы используете core.async. Это очень мало прибавит к этому простому счету и очень затруднит понимание того, что происходит в коде.
Наконец - просто профиль. Он покажет вам много интересного о вашем коде, которого вы, возможно, не знали.