2012-09-28 10 views
7

CSVをPostgreSQLデータベースにインポートする例はたくさんありますが、必要なものは500,000個のCSVを単一のPostgreSQLデータベースにインポートする効率的な方法です。各CSVは500KBを少し超えています(合計で約272GBのデータ)。多くのcsvファイルをPostgreSQLデータベースにインポートする

CSVは同じ形式であり、重複するレコードはありません(データは生データソースからプログラムによって生成されたものです)。私は検索しており、オプションについてはオンラインで検索し続けますが、これを可能な限り効率的な方法で実現するためのあらゆる方向性に感謝します。私はPythonでいくつかの経験を持っていますが、適切と思われる他のソリューションを掘り下げます。

ありがとうございます!

+1

のPostgreSQLにデータをインポートするための最速の方法は、 'COPY'コマンドを使用することです。 –

答えて

0

あなたが持っている素敵なデータがあります。私はPostgreについて100%確信しているわけではありませんが、少なくともMySQLはいくつかのSQLコマンドを提供し、csvをテーブルに直接供給します。これは挿入チェックなどをバイパスし、通常の挿入操作よりも1桁以上高速です。

おそらく最も速い方法は、単純なpythonスクリプトを作成して、postgreサーバーにどのcsvファイルを無期限に食べさせるのかを伝えることです。

7

あなたはPostgreSQL guide "Populating a Database"あなたがアドバイスのいくつかの部分表示されます読むことから始めた場合:

  1. は、単一のトランザクション内のデータをロードします。
  2. 可能であればCOPYを使用してください。
  3. データをロードして後で復元する前に、インデックス、外部キー制約などを削除します。

PostgreSQLのCOPY statementはすでにCSV形式をサポートしています。

COPY table (column1, column2, ...) FROM '/path/to/data.csv' WITH (FORMAT CSV) 

ので、それはあなたがすべてではPythonを使用していないオフ最善であるかのように見える、またはのみCOPY文の必要なシーケンスを生成するためのPythonを使用します。

+0

Gareth - 私はあなたの応答からCopy文でワイルドカードを使用できないと思いますか?私が知ることから、ファイルのリストを作成して個々のコピーコマンドを発行するためのプログラミング方法が必要です。私が間違っていれば私を修正してください。私は願っています:)。ワイルドカード* .csvでCopyステートメントを発行できればもっと簡単でしょう – FredG

+0

'COPY'コマンドのシーケンスを生成するのは簡単ですか?あなたはそれをシェルのようにすることができます: '(FILE in /path/to/*.csv; echo echo" COPY table(column1、column2、...)FROM '$ FILE' WITH(FORMAT CSV); "; done)> import-commands.sql' –

+0

これは少し効率的ではありませんか?500,000のコピーコマンドを含むファイルを生成しますか? – FredG

0

私はPHPとのpostgresを使用して、PHPでCSVファイルを読み込み、次の形式で文字列に乗る:単一のトランザクションで

{ {line1 column1, line1 column2, line1 column3} , { line2 column1,line2 column2,line2 column3} } 

ケアのPostgreSQL関数に文字列パラメータを渡すことで。

すべてのレコード、書式、データ量などを確認し、約3分間で50万レコードをインポートできます。

は、PostgreSQLの機能にデータを読み込むには:

DECLARE 
    d varchar[]; 
BEGIN 

    FOREACH d SLICE 1 IN ARRAY p_dados 
    LOOP 


    INSERT INTO schema.table (
     column1, 
     column2, 
     column3, 
    ) 
    VALUES ( 
     d[1], 
     d[2]::INTEGER, -- explicit conversion to INTEGER 
     d[3]::BIGINT, -- explicit conversion to BIGINT 
    );   
    END LOOP; 

    END; 
関連する問題