Clojure получение данных из БД, преобразование и печать в консоль

У меня есть следующая задача.
Мне нужно создать консольное приложение, которое принимает один параметр, который является количеством данных для генерации. Данные адрес и имя человека. Я создаю таблицу adress с state, city, zip-code поля. Я также создаю таблицу с first а также last name колонны. Я использую HugSQL для работы с PostgreSQL. Поэтому я хочу динамически смешивать адреса, имена и фамилии и выводить такой результат в консоль, количество сгенерированных значений зависит от аргумента, передаваемого приложению. Это мой код:

(ns project.core
  (:require
    [project.db.get :as get]))

(defn parse-int [s]
  (Integer. (re-find  #"\d+" s )))

(def usa-data (get/usa))

(defn usa-adress-getter []
  (let [data (into {} (shuffle  usa-data))
        city (get data :city)
        state (get data :state)
        zip (get data :zip_code)]
    (str state " " city " " zip)))

(defn repeater [times]
  (dotimes [i times]
    (println (usa-adress-getter))))

(defn -main [value]
  (repeater (parse-int value)))

Здесь я просто проверяю результат usa-adress-getter функция. Но время оценки функции слишком велико, у меня есть предел, который составляет 1 миллион значений за 1 минуту. Как увеличить скорость оценки? функция (get/usa) получить все данные из adress Таблица.

1 ответ

Трудно сказать из этого фрагмента кода, где есть узкие места в производительности, но вот несколько советов:

  • Используйте подсказки типа для горячих точек. Иногда компилятор Clojure не может определить типы, а затем подсказки типов могут значительно ускорить процесс. В этом случае вы можете установить его на usa-address-getter п: (defn ^String usa-adress-getter [] ...)
  • Вы можете рассмотреть возможность изменения вашего запроса, чтобы он возвращал объединенную строку из базы данных (используя функцию SQL, такую ​​как concat). Таким образом, вам не нужно будет получать значения из хэша и создавать строку самостоятельно.
  • Печать может быть медленной, так что вы можете устранить это, как говорит @leetwinsky.
  • Вы должны детально измерить производительность своего кода, иначе вы не сможете определить, достигла ли модификация какой-то скорости. Например, вы можете установить таймер, который печатает число msecs для каждой 1000 обработанных записей. И, конечно, делать только одно изменение за раз.

Надеюсь это поможет.

Другие вопросы по тегам