9

我看到很多将 CSV 导入 PostgreSQL 数据库的示例,但我需要一种将 500,000 个 CSV 导入单个 PostgreSQL 数据库的有效方法。每个 CSV 略多于 500KB(总计大约 272GB 的数据)。

CSV 的格式相同,并且没有重复记录(数据是从原始数据源以编程方式生成的)。我一直在搜索并将继续在网上搜索选项,但我将不胜感激以最有效的方式完成此任务的任何方向。我确实有一些使用 Python 的经验,但会深入研究任何其他似乎合适的解决方案。

谢谢!

4

3 回答 3

10

如果您从阅读PostgreSQL 指南“填充数据库”开始,您会看到几条建议:

  1. 在单个事务中加载数据。
  2. COPY尽可能使用。
  3. 在加载数据之前删除索引、外键约束等,然后再恢复它们。

PostgreSQL 的COPY语句已经支持 CSV 格式:

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

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

于 2012-09-29T10:23:07.537 回答
0

你那里有大量的数据。我不是 100% 确定 Postgre,但至少 MySQL 提供了一些 SQL 命令,将 csv 直接输入到表中。这绕过了任何插入检查等,这就是为什么比任何普通插入操作快一个数量级以上。

因此,可能最快的方法是创建一些简单的 python 脚本,告诉你的 postgre 服务器,哪些 csv 文件以何种顺序贪婪地吞噬它的无穷无尽的表格。

于 2012-09-28T20:24:35.040 回答
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;
于 2013-10-18T13:13:34.300 回答