使用clojure jdbc将文件记录插入postgres数据库与python psycopg2相比需要很长时间

str*_*kai 6 python java postgresql jdbc clojure

我正在尝试将记录插入到postgres DB中,并且使用python psycopg2和cursor.copy_from方法需要大约3个小时,而需要40秒

我的代码有什么问题,使用clojure.java.jdbc/db-do-prepared也需要大约3个小时.请帮忙!

文件大小为175M,它有409,854条记录

(defn-
  str<->int [str]
  (let [n (read-string str)]
    (if (integer? n) n)))

(with-open [file (reader "/path/to/foo.txt")]
    (try
      (doseq [v (clojure-csv.core/parse-csv file)]

        (clojure.java.jdbc/insert! db  :records 
                      nil
                      [(v 0) (v 1) (v 2) (str<->int (v 3))]))
      (println "Records inserted successfully")
      (Exception e
        (println (.getNextException e) e))))
Run Code Online (Sandbox Code Playgroud)

str*_*kai 1

四年后,决定回到这个问题并分享解决方案指南,我相信这将帮助某人入门。

你可以看看clojure.java.jdbc/insert-multi!并进行适当编辑以适合数据库中的列类型

(let [from "/path/to/foo.txt"
      to "/path/to/temp/foo.txt"]
  (with-open [reader (io/reader from)
              writer (io/writer to)]
    (doall
      (->> (csv/read-csv reader)
           ;(drop 1)   ;if theres header
           (map #(list (nth % 0 nil) (nth % 2 nil)  (nth % 3 nil)))
           (csv/write-csv writer))))
  (let [fstream (slurp to)
        streamarray (map #(str/split % #",")
                         (str/split-lines fstream))]
    (clojure.java.jdbc/insert-multi! pg-db              ;connection or {:datasource hk-cp}
                                     :tbl_cdrs_da                 ;table name
                                     [:origin_node_type :origin_transaction_id :da_ua_id] ;colums
                                     streamarray)))               ;array
Run Code Online (Sandbox Code Playgroud)