将大量csv文件导入PostgreSQL数据库的有效方法

时间:2012-09-28 19:38:22

标签: python csv import postgresql-9.1

我看到很多将CSV导入PostgreSQL数据库的例子,但我需要的是将500,000个CSV导入单个PostgreSQL数据库的有效方法。每个CSV有点超过500KB(总共大约272GB的数据)。

CSV的格式相同,没有重复记录(数据是从原始数据源以编程方式生成的)。我一直在寻找并将继续在线搜索选项,但我希望能以最有效的方式完成任务。我确实有一些Python的经验,但会深入研究其他合适的解决方案。

谢谢!

3 个答案:

答案 0 :(得分:7)

如果您从阅读PostgreSQL guide "Populating a Database"开始,您会看到几条建议:

  1. 在单个交易中加载数据。
  2. 尽可能使用COPY
  3. 在加载数据之前删除索引,外键约束等,然后再恢复它们。
  4. PostgreSQL的COPY statement已经支持CSV格式:

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

    因此看起来你最好不要使用Python,或仅使用Python生成所需的COPY语句序列。

答案 1 :(得分:0)

你有很多数据。我对Postgre并不是100%肯定,但至少MySQL提供了一些SQL命令,可以将csv直接输入到表中。这会绕过任何插入检查等等,并且比任何普通的插入操作都快一个数量级。

所以最快的方法就是创建一些简单的python脚本,告诉你的postgre服务器,哪些csv文件以哪种顺序吞噬它的无穷无尽的表。

答案 2 :(得分:0)

我使用php和postgres,用php读取csv文件并按以下格式骑一个字符串:

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

通过将字符串参数传递给postgresql函数来处理单个事务。

我可以检查所有记录,格式,数据量等,并在大约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;