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 обработанных записей. И, конечно, делать только одно изменение за раз.
Надеюсь это поможет.