3

編集

結局のところ、N00bの問題です。lein ring server実行するとアプリがインタープリター モードで 実行されることに気付きませんでした。


次の Clojure/JDBC フラグメントを最適化して、(はるかに) 高速に実行できますか?

(defn test-sql []
  (sql/with-connection (db-connection)
    (sql/with-query-results results ["select * from users order by username asc"]
        (doseq [row results ] 
          (println "User" (row :first_name) (row :last_name)) results))))

ETL プロジェクトに Clojure を使用することを検討しています。私が書いた最初のテストは、そこに ~280K のレコードがあるテーブルからデータを出力することでした。これまでに思いついた実装はかなり遅かったです。Java で約 12 秒かかるのに (「raw」アクセスではなく myBatis を使用してオブジェクトを設定しても)、Clojure ソリューションでは約 9.5 分かかります。

dosq の代わりに map を試し、ここで概説されているようなカーソルを使用してみました: http://asymmetrical-view.com/2010/10/14/clojure-and-large-result-sets.html、しかし私はほぼ同じになりますそれぞれの実行時間。

FWIW、.println java.lang.System/out(驚くべきことではありませんが)同じ結果を実行し、 with-query-results* を使用すると:

(defn test-sql2 []
  (sql/with-connection (db-connection)
    (sql/with-query-results* ["select * from users order by username asc"]
      (fn [row] (println "User" (row :first_name) (row :last_name))))))

同じ同じ。

4

1 に答える 1

2

これは恥ずかしいことです...結局のところ、パフォーマンスが比較的低いのは、単純なWebアプリの一部としてテストコードを実行したことが原因でした(この質問のコンテキストでは意味がありません)。を使用して実行lein ring serverするのと同じだと思いますrepl(私はその接続を確立しませんでした)。でコンパイルとパッケージ化を試み、lein uberjarその jar を で実行しjava -jarたところ、Java アプリに匹敵するパフォーマンスが得られました。

于 2012-11-19T09:37:40.597 に答える