我看到很多将 CSV 导入 PostgreSQL 数据库的示例,但我需要一种将 500,000 个 CSV 导入单个 PostgreSQL 数据库的有效方法。每个 CSV 略多于 500KB(总计大约 272GB 的数据)。
CSV 的格式相同,并且没有重复记录(数据是从原始数据源以编程方式生成的)。我一直在搜索并将继续在网上搜索选项,但我将不胜感激以最有效的方式完成此任务的任何方向。我确实有一些使用 Python 的经验,但会深入研究任何其他似乎合适的解决方案。
谢谢!
我看到很多将 CSV 导入 PostgreSQL 数据库的示例,但我需要一种将 500,000 个 CSV 导入单个 PostgreSQL 数据库的有效方法。每个 CSV 略多于 500KB(总计大约 272GB 的数据)。
CSV 的格式相同,并且没有重复记录(数据是从原始数据源以编程方式生成的)。我一直在搜索并将继续在网上搜索选项,但我将不胜感激以最有效的方式完成此任务的任何方向。我确实有一些使用 Python 的经验,但会深入研究任何其他似乎合适的解决方案。
谢谢!
如果您从阅读PostgreSQL 指南“填充数据库”开始,您会看到几条建议:
COPY
尽可能使用。PostgreSQL 的COPY
语句已经支持 CSV 格式:
COPY table (column1, column2, ...) FROM '/path/to/data.csv' WITH (FORMAT CSV)
所以看起来你最好不要使用 Python,或者只使用 Python 来生成所需的COPY
语句序列。
你那里有大量的数据。我不是 100% 确定 Postgre,但至少 MySQL 提供了一些 SQL 命令,将 csv 直接输入到表中。这绕过了任何插入检查等,这就是为什么比任何普通插入操作快一个数量级以上。
因此,可能最快的方法是创建一些简单的 python 脚本,告诉你的 postgre 服务器,哪些 csv 文件以何种顺序贪婪地吞噬它的无穷无尽的表格。
我使用 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;