如何有效地将数据从 CSV 加载到数据库中?

Posted

技术标签:

【中文标题】如何有效地将数据从 CSV 加载到数据库中?【英文标题】:How to efficiently load data from CSV into Database? 【发布时间】:2020-03-04 20:22:40 【问题描述】:

我有一个包含数据的 CSV/TSV 文件,并希望将该 CSV 数据加载到数据库中。我正在使用 Java 或 Python 和 PostgreSQL 来做到这一点(我无法改变它)。

问题在于,对于每一行,我都会进行一次 INSERT 查询,如果我说 600.000 行,它的效率就不高了。有没有更有效的方法?

我想知道我是否可以获取更多行并只创建一个大查询并在我的数据库上执行它,但我不确定这是否有帮助,或者我应该将数据分成 100 块并执行 100查询?

【问题讨论】:

答案是可以。我认为您正在寻找所谓的“批量插入”。 ***.com/questions/758945/… 谢谢你,@ZiemowitStolarczyk :) 【参考方案1】:

如果 CSV 文件与copy from stdin 要求的格式兼容,那么最有效的方法是使用CopyManager API。

参见this answer 或this answer 示例代码。


如果您的输入文件与 Postgres 的复制命令不兼容,您需要自己编写 INSERT。但是你可以通过使用 JDBC 批处理来加快这个过程:

类似的东西:

PreparedStatement insert = connection.prepareStatement("insert into ...");
int batchSize = 1000;
int batchRow = 0;
// iterate over the lines from the file
while (...) 
   ... parse the line, extract the columns ...
   insert.setInt(1, ...);
   insert.setString(2, ...);
   insert.setXXX(...);
   insert.addBatch();
   batchRow ++;
   if (batchRow == batchSize) 
     insert.executeBatch();
     batchRow = 0);
   

insert.executeBatch();

在您的JDBC URL 中使用reWriteBatchedInserts=true 将进一步提高性能。

【讨论】:

非常感谢您提供这个有用的答案。 :)【参考方案2】:

假设服务器可以直接访问该文件,您可以尝试使用COPY FROM 命令。如果您的 CSV 格式不正确,将其转录为 COPY 命令将处理的内容(例如,在复制到服务器可以访问的位置时)可能会更快。

【讨论】:

没关系,似乎 Ziemowit Stolarczyk 已经链接到一个几乎相同想法的答案,但更好的解释 =)

以上是关于如何有效地将数据从 CSV 加载到数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

有效地将数据从 CSV 读取到具有多个分隔符的数据框中

如何有效地将大文件加载到 IndexedDB 存储中?我的应用程序在超过 100,000 行时崩溃

使用 python 有效地将数据导出到 CSV

如何正确地将数据从 *.csv 文件导入 mysql 数据库中的给定表

如何有效地将巨大的 sql 表加载到 asp.net 应用程序内存中以进一步迭代它?

有效地将许多大型 CSV 文件中的 XYZ 坐标排序到小图块中