gpt4 book ai didi

c++ - 使用 libpqxx 批量加载数据

转载 作者:太空狗 更新时间:2023-10-29 21:06:56 26 4
gpt4 key购买 nike

我需要使用 libpqxx 将大量数据(大约 7.000.000 个条目)批量加载到 PostgreSQL 数据库中.我已阅读有关 how to populate the database 的文档,但我不确定如何在我的案例中使用它。首先我不能使用文件,所以 COPY在数据库上是没有问题的。此外,我正在导入的数据库和表需要在导入时正常运行。

场景如下:我们定期(大约每月一次)从另一个应用程序获取一个包含所有数据(包括已经存在的条目)的文件。由于条目的数量,不可能检查每个条目是否存在,我们只是批量插入新数据(在预处理之后)。

目前为了处理这个问题,我创建了一个新表,使用 libpqxx 中的 tablewriter 插入数据(没有事务),然后在一个事务中我将旧表重命名,并将新表重命名到正确的位置。

此外,我们不仅需要对一个表执行此操作,还需要对具有不同布局的多个表执行此操作。因此,我试图将表格的编写与日期的解析分开。现在我只需要考虑表的创建。为此,我使用了

create temporary table foo_temp (like foo including indexes including defaults including constraints );

这样我就得到了一个类似于foo的表格,而且我不需要真正知道我写的地方的布局。然而,这给我留下了问题,这将生成一个包含索引和约束的表,上面的指南说索引会使批量插入变慢。但是,如果我删除索引和约束(或者首先不复制它们),我需要一种方法在之后在为原始表设置的同一庄园中重新创建它们。

关于如何快速处理这个问题有什么好的提示吗?

编辑:

在相关的方面:玩弄数据库我刚刚注意到,上面的 CREATE TABLE 不会复制任何外键约束,所以我似乎也需要手动指定这些约束。或者有没有办法将这些与所有其他约束一起处理?

最佳答案

我使用下一个策略通过索引和约束创建实现了每秒超过 100000 次插入:1. 第一次连接创建继承父表的表,使用PQputCopyData以二进制方式复制数据。2. 使用其他几个连接创建索引。 PostgreSQL 为每个客户端创建一个线程,因此为了利用多核优势,我们需要使用多个连接。

您可以使用线程安全队列或使用 PostgreSQL NOTIFY 将数据发送到应用程序内部的索引线程。

关于c++ - 使用 libpqxx 批量加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6262876/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com