簡體   English   中英

Clojure從數據庫獲取數據,轉換並打印到控制台

[英]Clojure getting data from db, transform and print into console

我有以下任務。
我需要創建一個使用一個參數的控制台應用程序,該參數是要生成的數據數量。 數據是人的地址和姓名。 我創建一個包含state, city, zip-code字段的表格adress 我還創建一個表firstlast 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表中檢索所有數據。

從這段代碼很難說出性能瓶頸在哪里,但是這里有一些技巧:

  • 對熱點使用類型提示。 有時Clojure編譯器無法找出類型,然后使用類型提示可以加快處理速度。 在這種情況下,可以在usa-address-getter fn上進行設置: (defn ^String usa-adress-getter [] ...)
  • 您可以考慮修改查詢,以使其從數據庫返回連接的字符串(使用諸如concat類的SQL函數)。 這樣,您將不需要從哈希中獲取值並自己構建字符串。
  • 打印內容可能很慢,因此您可以消除這種情況,例如@leetwinsky說。
  • 您必須詳細評估代碼的性能,否則您將無法判斷修改是否使您獲得了一定的速度。 例如,您可以放置​​一個計時器,該計時器為每處理1000條記錄打印毫秒數。 當然,一次只能進行一次更改。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM