2017-04-11 4 views
1

私はR.COPYを使用してRを介して100万行以上のINSERTをPostgresに高速化しますか?

query <- sprintf("BEGIN; 
         CREATE TEMPORARY TABLE 
         md_updates(ts_key varchar, meta_data hstore) ON COMMIT DROP; 

         INSERT INTO md_updates(ts_key, meta_data) VALUES %s; 
         LOCK TABLE %s.meta_data_unlocalized IN EXCLUSIVE MODE; 

         UPDATE %s.meta_data_unlocalized 
         SET meta_data = md_updates.meta_data 
         FROM md_updates 
         WHERE md_updates.ts_key = %s.meta_data_unlocalized.ts_key; 
         COMMIT;", md_values, schema, schema, schema, schema) 

DBI::dbGetQuery(con,query) 

に全体を使用して複数行のINSERT文字列を用意しており、そうするために、バルクINSERT/UPSERT行の適度に多量にRを使用して、PostgreSQLデータベースにしたいと思い関数はhereです。驚いたことに(私にはちょっと離れて)私はUPDATEの部分が問題ではないことを学びました。私はそれを残して再度クエリを実行し、それほど速くはなかった。 INSERT 100万レコードがここで問題になっているようです。

私はいくつかの研究を行なったし、かなりの情報が見つかりました:@Erwin Brandstetterと@Craigリンガーから

bulk inserts

bulk inserts II

what causes large inserts to slow down

答えは特に有用でした。インデックスを落としたり、いくつかの提案をしたりすることで、私はかなりスピードアップできました。

しかし、私は有望と思われる別の提案を実装するのに苦労しました:COPY

sql <- sprintf('CREATE TABLE 
      md_updates(ts_key varchar, meta_data hstore); 
      COPY md_updates FROM STDIN;') 


dbGetQuery(sandbox,"COPY md_updates FROM 'test.csv' DELIMITER ';' CSV;") 

しかし、私はそれは、余分な.csvファイルから読み込むことなく成し遂げることはできません。問題は、私はそれが私のために 次作品

R.

内から成し遂げることはできないです。だから、私の質問は以下のとおりです。

  • は本当に私が得た複数行INSERTこっちの有望なアプローチ(COPYです

  • ファイルにデータを書き込むことなく、Rの中からCOPYを使用する方法はありますか? 。データがメモリにフィットし、それはMEMですでにだから、なぜディスクに書き込む?

私は、それぞれOS XおよびRHEL 9.5でPostgreSQL 9.5を使用しています。

+0

と同じ列を持っている

install.packages("RPostgreSQL") library(RPostgreSQL) con <- dbConnect(PostgreSQL(), user="...", password="...", dbname="...", host="...") dbSendQuery(con, "copy foo from stdin") postgresqlCopyInDataframe(con, df) 

それはRにあることがありますか? Rは 'psql'を呼び出せますか?そうであれば、 '\ COPY'(' COPY'ではなく)を使います。 –

+0

@Neil McGuiganはい、Rにする必要があります.Rはあらゆる種類のシステムコールを行うことができるので、psqlはオプションですが、これはパッケージの一部であり、私はpsqlに頼っていません。まだ内部のRソリューションを探しています。 –

+0

EricからErwinを元に戻してください - それは変わっています –

答えて

2

RPostgreSQLは、それはあなたが望む何をすべきのように見える「CopyInDataframe」機能があります:表fooは、データフレームdf

+0

ありがとう+1これは実際に動作します。私は何年も前から 'RPostgreSQL'パッケージを使っていましたが、そのような関数を探しませんでした。それはまさに私が望むものです。それが本当に物事をスピードアップするかどうかを確認するためにいくつかのベンチマークを実行します。 –

+1

ご協力いただきありがとうございます。より大きな 'INSERT'では、実際には6倍高速です。 –

関連する問題