使用 libpqxx 批量存储数据或如何在 libpqxx 中使用 COPY 语句

2024-05-24

要在 PostgreSQL 中插入批量数据/填充数据库,最快的方法是使用 COPY。Source https://stackoverflow.com/questions/758945/whats-the-fastest-way-to-do-a-bulk-insert-into-postgres
我必须填充数据库。现在我正在写入速度低至 100-200每秒。这涉及通过 C++ 库发送许多单独的插入libpqxx。我认为的两个原因是:

  1. 数据中有很多重复的记录。(我有原始日志,我会解析并发送这些日志。)这会导致主键异常。
  2. 插入语句的一一发送。

第一个是我无法控制的。然而我正在阅读第二个。
据我所知,tablewriter 类适合这个目的。但它显然已被弃用。我读到可以使用 stdin 作为复制参数。
但在这些线索之后我迷失了。有人可以引导我找到解决方案吗?

编辑: 这是代码,其中我有一个执行该语句的函数:

void pushLog(Log log,pqxx::connection *conn){
    pqxx::work w(*conn);
    std::stringstream stmt;
    stmt<<"INSERT INTO logs VALUES('"<<log.getDevice()<<"','"<<log.getUser()<<"','"<<log.getDate()<<"','"<<log.getLabel()<<"');";
    try{
        pqxx::result res = w.exec(stmt.str());
        w.commit();
    }
    catch(const std::exception &e){
        std::cerr << e.what() << std::endl;
        std::cout<<"Exception on statement:["<<stmt.str()<<"]\n";
        return;
    }

}

我之前建立了连接,并传递了对它的引用。

PS:这个问题可能缺少一些细节。如果有的话,请评论,我会编辑并添加它们。


The pushLog函数单独提交每个插入,并且提交速度很慢。

正如文档中所解释的填充数据库 http://www.postgresql.org/docs/current/interactive/populate.html:

如果允许单独提交每个插入,则 PostgreSQL 是 为添加的每一行做大量工作

Also:

在一个事务中进行所有插入的另一个好处是 如果一行的插入失败,则插入 到该点插入的所有行都将回滚,因此您不会 被部分加载的数据卡住

然而,在您的情况下,这将是一个问题而不是好处,因为每个 INSERT 可能会因主键违规而失败,从而取消自上次提交以来的先前 INSERT。 请注意,这也会出现问题COPY,你应该使用它吗?

由于确实有必要将事务中的查询分组以提高性能,因此您需要以不中止事务的方式处理主键违规。

通常使用两种方法:

  1. 避免错误:INSERT INTO... WHERE NOT EXISTS (SELECT 1 FROM table WHERE primary_key=...)

  2. 通过插入具有忽略 itr 的 EXCEPTION 块的 plpgsql 函数来捕获错误。导致重复的特定 INSERT 将被取消,但事务不会中止。

如果您有并发插入,则需要使用锁定策略来改进这些方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 libpqxx 批量存储数据或如何在 libpqxx 中使用 COPY 语句 的相关文章

  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 如何在 pg-promise 中设置模式

    我正在搜索的文档pg 承诺 https github com vitaly t pg promise特别是在创建客户端时 但我无法找到设置连接中使用的默认架构的选项 它始终使用public架构 我该如何设置 通常 为数据库或角色设置默认架构
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler
  • 如何获取自定义订单的结果? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 代替ASC or DESC 我希望我的查询结果采用特定的自定义顺序 例如 如果我想要的结果不是 A B C D 而是 P A L H 该怎么
  • SQL 更新 - 更新选定的行

    我正在使用 SQL Server 2008 我有一个名为MYTABLE有两列 ID STATUS 我想编写一个存储过程来返回其记录STATUS是 0 但是这个存储过程必须更新STATUS返回行数为 1 如何在单个查询中执行此选择和更新操作
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐

  • duckmap 到底有什么作用?

    From 文档 https docs perl6 org routine duckmap duckmap将会应用 block每个元素上并返回一个新列表 其中包含块的已定义返回值 对于未定义的返回值 duckmap如果该元素实现了 将尝试下降
  • 将产生 goroutine 的 golang 方法

    据我所知 如果 goroutine 太忙 它们会阻止其他 goroutine 运行 对我来说 这意味着我的应用程序的性能和响应能力可能取决于我知道哪些库方法将控制其他 goroutine 例如通常是 Read 和 Write 有什么方法可以
  • 使用 php 将 swf 转为 pdf

    有没有办法使用 php 将 SWF 转换为 pdf 我的意思是该页面有一个按钮 单击它必须将 swf 内容导出为 pdf 格式 您可以尝试的一种方法是使用ffmpeg http www ffmpeg org 使用 image2 输出编解码器
  • Microsoft.NETCore.App 和 Microsoft.NETCore.Platforms 的传递依赖项如何工作

    我很难弄清楚传递依赖项的版本解析如何适用于框架 元包 我问的原因是 似乎每次我们引入 旧 依赖项时 例如指向的东西netstandard2 0或者 2 1 我们最终得到了一长串过时的包 我们的构建管道再次报告了这一点 举个例子 给定一个 n
  • Instagram 广场照片 API

    Instagram 会提供任何通过 API 抓取肖像 风景的方法吗 API 文档看起来没有改变 截至目前 他们仍然返回肖像图像的正方形尺寸 但 api 文档没有提供任何获取原始图像的方法 他们会继续返回方形图像吗 Instagram对此有何
  • 在 GWT 中使用 SVG

    我想知道是否可以在面板中包含 SVG 内容 或者在 GWT 中工作的任何内容 能够以编程方式向 SVG 添加更多内容 例如添加圆或曲线 并处理鼠标事件 这会是在 SVG 或 GWT 中 我尝试创建一个 HTML 对象 添加以下内容
  • 下界比较函数

    我有以下结构 enum quality good 0 bad uncertain struct Value int time int value quality qual class MyClass public MyClass Inser
  • Linux中使用管道进行进程间通信

    我已经编写了在 linux 中写入数字以进行管道传输的代码 如下所示 但显示错误 任何人都可以帮助我解决这个问题 基本上该程序的问题陈述如下 一个程序将打开一个管道 向管道写入一个数字 其他程序将打开同一管道 读取数字并打印它们 关闭两个管
  • 如何从现有存储库中的分支创建新的 GitHub 存储库?

    I have master and 新项目分支机构 现在我想创建一个全新的存储库及其基于新项目分支的主存储库 背景 我有一个存储库 其中包含三个独立的应用程序 事情并不是这样开始的 仓库中最初只有一个应用程序 然而 随着时间的推移 业务需求
  • Windows Azure 上的多租户应用程序

    我们想要创建具有共享数据库表结构的多租户应用程序 目前 使用标准 SQL Server 我们可以通过为每个表提供 TenantID 来实现这一点 我们能否在 Windows Azure 上实现相同的目标 但无需 TenantID 此致 阿列
  • 连接管理 ASP.net

    如何管理 ASP Net 应用程序中的数据库连接 我的理解告诉我 最好 的方法是打开连接 进行查询 关闭连接 并多次执行此操作 因为连接池使成本可以忽略不计 当我有一个 DAL 时 问题就出现了 其中每个方法都管理自己的连接 例如 User
  • Azure B2C 中的 KMSI 实际上有什么作用?

    我们提供了此文档 说明如何使用自定义策略设置 保持登录状态 KMSI https learn microsoft com en us azure active directory b2c custom policy keep me sign
  • Doctrine - 使用查询生成器时如何水合集合

    A 我问的上一个问题 https stackoverflow com questions 27572139 doctrine how to extract results and their relationships as array 2
  • 如何使用Google API PHP SDK获取用户信息

    我正在尝试为拥有 Google 帐户的用户添加登录选项到我的网站 我已经能够实现这个 Facebook 但在使用 Google 获取用户帐户信息时遇到问题 我正在使用位于此处的 Google PHP SDK https github com
  • iOS 9 + Xcode 7 的 Segue 上的应用程序导致整个设备崩溃

    更新 我已经在这一年中使用了我的一个 DTS 目前与 Apple 支持工程师合作 根据他的建议 我还为此创建了一个错误报告 随着时间的推移 我将更新此线程 希望能产生最终的解决方案 不知何故 我找到了一种方法来创建一个可以真正重新启动模拟器
  • 如何使用 blazor 前端 http 请求附加令牌

    我使用 blazor 作为前端 api 已完成 JWT 配置 前端可以创建用户帐户并登录API 但现在我的前端httpclient没有设置JWT令牌 所以如果我在Api控制器中设置 授权 前端将无法访问它 api程序代码如下 builder
  • UITableview Cell 异常 - '必须将自动调整大小掩码转换为约束才能具有 _setHostsLayoutEngine:YES

    我正在使用 UITableView CategoryCell cell tableView dequeueReusableCellWithIdentifier CellIdentifierLink 这是我收到错误的行 它在 IOS 7 中工
  • MS Batch:检查驱动器是否正在使用

    我需要检查驱动器 Z 是否正在使用 例如 正在由应用程序使用 已打开 我的批处理文件如下所示 Mount Z wait 15 minutes check if drive Z is in use IF NOT unmount Z ELSE
  • 聚合物中的主机属性和属性有什么区别?

    我正在从 0 5 迁移到 1 0 在阅读时 我注意到声明属性有两种不同的方式 使用hostAttributes and properties 这两个有什么区别 宿主属性是与元素相应的 Javascript 属性 您在其中声明的 不匹配的属性
  • 使用 libpqxx 批量存储数据或如何在 libpqxx 中使用 COPY 语句

    要在 PostgreSQL 中插入批量数据 填充数据库 最快的方法是使用 COPY Source https stackoverflow com questions 758945 whats the fastest way to do a