2012-09-28 64 views
7

我看到很多將CSV導入PostgreSQL數據庫的示例,但我需要的是將500,000個CSV導入到單個PostgreSQL數據庫中的有效方法。每個CSV有點超過500KB(總共大約272GB的數據)。將大量csv文件導入到PostgreSQL中的有效方法db

CSV的格式相同且沒有重複記錄(數據是從原始數據源以編程方式生成的)。我一直在尋找並將繼續在線搜索選項,但是我希望能夠以最有效的方式完成此任務的任何方向。我對Python有一些經驗,但會深入研究其他任何似乎都適合的解決方案。

謝謝!

+1

將數據導入到PostgreSQL的最快的方法是使用'COPY'命令。 –

回答

0

你在那裏有很好的數據。我對Postgre並不十分確定,但至少MySQL提供了一些SQL命令,可以將csv直接提供給一個表。這繞過了任何插入檢查等等,並且因此比任何普通的插入操作快一個數量級以上。

所以去的大概最快的方法是創建一些簡單的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所有,或使用Python只產生COPY報表所需的序列。

+0

Gareth - 我從你的回答中假設你不能在Copy語句中使用通配符?從我所知道的,我需要一些類型的編程方法來創建文件列表,然後發出單獨的複製命令。如果我錯了,請糾正我。我希望我是:)。如果我可以發出帶有通配符的複製語句,就會容易得多* .csv – FredG

+0

確實生成「COPY」命令序列很容易?例如:'(用於FILE中的/path/to/*.csv;執行echo「COPY表(column1,column2,...)FROM'$ FILE'WITH(FORMAT CSV);」;完成)> import-commands.sql' –

+0

這是不是有點低效?用500,000個複製命令生成一個文件? – FredG

0

我使用PHP和Postgres,和閱讀用PHP csv文件,並以下列格式騎字符串:字符串參數傳遞給PostgreSQL函數在一個事務

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

護理。

我可以檢查所有記錄,格式,數據量等,並在大約3分鐘內獲得導入500,000條記錄的結果。

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;