c - 从 PQexec 流式传输 libpq 结果

标签 c postgresql batch-processing postgresql-9.3 libpq

在尝试通过 libpq 的 PQexec 从 C 语言的 Postgres 9.3 下载大量数据时,我想知道是否有一种方法可以从服务器流式传输结果集。从上面的观察,我可以看到当我调用 PQexec 时,我的内存利用率增加了大约预期的结果集大小。我想迭代结果并在处理完结果后“丢弃”结果,以降低处理节点上的内存利用率。我在 docs 中找不到任何提及此类行为的信息。 。类似于 psycopg2 的 fetchmany将是理想的。

通过重写查询以批量运行来“流式传输”libpq 结果的唯一方法是吗?

最佳答案

有了足够新的 libpq(PostgreSQL 9.2 附带的 libpq-5.5),您可以调用 PQsetSingleRowMode,如 Retrieving Query Results Row-By-Row 中所述。 。 PQexec 将必须替换为异步 PQsendQuery

否则,适用于所有版本的技术是在 SQL 级别打开游标(请参阅 DECLARE...CURSOR )并通过连续的 PQexec 调用从中获取游标,直到完成。这就是命令行工具 psql 中实现 FETCH_COUNT 的方式。
它还具有以下优点:当游标打开并且程序仍在结果上循环时,可以在同一连接上执行其他查询。

关于c - 从 PQexec 流式传输 libpq 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28661198/

相关文章:

sql - 带有任何子句的 Postgres 相似性运算符 - 每个参数的限制?

algorithm - 前缀相似度搜索

c - 什么时候使用 pthread_spin_lock 是正确的(例如 pthread mutex)?

C++ - 多线程

c - 用于用户名验证的正则表达式修改

postgresql - 返回包含字段的表,而不是 PostgreSQL 中的记录

mongodb - 使用golang从MongoDB批量获取记录

ffmpeg - 如何使用 ffmpeg 转换整个目录?

grails - 如何在 Grails 中实现批处理

iphone - 函数 'funcName' 的隐式声明;之前隐式声明 'funcName' 在这里?