私は以下の作業をしています。
生成するデータの数である1つのパラメータを取るコンソールアプリケーションを作成する必要があります。データは人の住所と名前です。 state, city, zip-code
フィールドのテーブルadress
を作成します。また、first
とlast name
の列を持つテーブルを作成します。私はHugSQLを使ってPostgreSQLを扱います。だから私は動的にアドレスと姓と名を混合し、そのような結果をコンソールに出力したいのですが、生成される値の数はアプリケーションに渡される引数に依存します。これは私のコードです:dbからデータを取得し、変換してコンソールに出力するClojure
(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分で100万の値である制限があります。どのように評価のスピードを上げるには? 機能(get/usa)
adress
テーブルからすべてのデータを取得します。
あなたの 'usa-address-getter'は奇妙に見えます。それは適切に機能しますか? 'project.db/get'を使って' clojure.core/get'をシャドーするので、本当にすべきではありません。コード – leetwinski
も '(into {}(shuffle usa-data))'を確認してください。usa-dataはレコードのシーケンスを返さなければならないので、マップに追加することは無意味です。多分それは '({{}への(最初の(usa-data)のシャッフル))'であるべきですか?いずれにしても、低パフォーマンスの鍵となることを願っています。すべての反復で数百万のアイテムを熱心にシャッフルします。本当に**遅いです(私のマシンで約250ms)。私は 'rand-nth':' '{{}(rand-nth usa-data))' – leetwinski
と一緒に行くことをお勧めします。レコードを1つずつ印刷することが必須でない場合は、全体をコレクションを作成してから一度だけ印刷してください。 '(clojure.pprint/pprint(繰り返し)(パース値)usa-address-getter))'のように 'repeater'関数を投げ捨ててください。 – leetwinski