2017-10-10 7 views
0

私は以下の作業をしています。
生成するデータの数である1つのパラメータを取るコンソールアプリケーションを作成する必要があります。データは人の住所と名前です。 state, city, zip-codeフィールドのテーブルadressを作成します。また、firstlast 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テーブルからすべてのデータを取得します。

+0

あなたの 'usa-address-getter'は奇妙に見えます。それは適切に機能しますか? 'project.db/get'を使って' clojure.core/get'をシャドーするので、本当にすべきではありません。コード – leetwinski

+0

も ​​'(into {}(shuffle usa-data))'を確認してください。usa-dataはレコードのシーケンスを返さなければならないので、マップに追加することは無意味です。多分それは '({{}への(最初の(usa-data)のシャッフル))'であるべきですか?いずれにしても、低パフォーマンスの鍵となることを願っています。すべての反復で数百万のアイテムを熱心にシャッフルします。本当に**遅いです(私のマシンで約250ms)。私は 'rand-nth':' '{{}(rand-nth usa-data))' – leetwinski

+0

と一緒に行くことをお勧めします。レコードを1つずつ印刷することが必須でない場合は、全体をコレクションを作成してから一度だけ印刷してください。 '(clojure.pprint/pprint(繰り返し)(パース値)usa-address-getter))'のように 'repeater'関数を投げ捨ててください。 – leetwinski

答えて

0

これは、パフォーマンスのボトルネックがあるコードのこの部分から言うのは難しいのですが、ここではいくつかのヒントがあります:ホットスポットについて

  • 使用タイプヒントを。ときどきClojureコンパイラは型を理解できず、型ヒントを使うと処理速度が上がることがあります。この場合、usa-address-getter fn:(defn ^String usa-adress-getter [] ...)
  • に設定できます。concatのようなSQL関数を使用して、データベースから連結された文字列を返すようにクエリを変更することを検討できます。そうすれば、ハッシュから値を取得して文字列を自分で構築する必要はありません。
  • 印刷物が遅くなる可能性があるので、@leetwinskyさんのようにそれを取り除くことができます。
  • コードのパフォーマンスを詳細に測定する必要があります。そうしないと、変更によってスピードが増したかどうかを判断できません。たとえば、処理された1000レコードごとにミリ秒数を出力するタイマーを置くことができます。もちろん、一度に1つだけ変更してください。

これが役に立ちます。

関連する問題