从 PQexec 流式传输 libpq 结果
Streaming libpq results from PQexec
在尝试通过 libpq PQexec
从 C 中的 Postgres 9.3 下载大量数据时,我想知道是否有办法从服务器流式传输结果集。从顶部看,我可以看到我的内存利用率在调用 PQexec
时大致增加了预期的结果集大小。我想遍历结果和 "throw away" 处理后的结果,以降低处理节点上的内存利用率。我找不到在 docs. Something like psycopg2's fetchmany 中提及此类行为是理想的。
从 libpq 批量重写查询到 运行 的结果是 "stream" 的唯一方法吗?
使用足够新的 libpq(libpq-5.5 与 PostgreSQL 9.2 一起发布),您可以调用 PQsetSingleRowMode
,如 Retrieving Query Results Row-By-Row 中所述。
PQexec
必须由异步 PQsendQuery
.
替换
否则,适用于所有版本的技术是在 SQL 级别打开游标(请参阅 DECLARE...CURSOR),然后通过连续的 PQexec
调用从中获取游标,直到完成。这就是 FETCH_COUNT
在命令行工具 psql 中的实现方式。
它还有一个优点是,当游标打开并且程序仍在循环结果时,可以在同一连接上执行其他查询。
在尝试通过 libpq PQexec
从 C 中的 Postgres 9.3 下载大量数据时,我想知道是否有办法从服务器流式传输结果集。从顶部看,我可以看到我的内存利用率在调用 PQexec
时大致增加了预期的结果集大小。我想遍历结果和 "throw away" 处理后的结果,以降低处理节点上的内存利用率。我找不到在 docs. Something like psycopg2's fetchmany 中提及此类行为是理想的。
从 libpq 批量重写查询到 运行 的结果是 "stream" 的唯一方法吗?
使用足够新的 libpq(libpq-5.5 与 PostgreSQL 9.2 一起发布),您可以调用 PQsetSingleRowMode
,如 Retrieving Query Results Row-By-Row 中所述。
PQexec
必须由异步 PQsendQuery
.
否则,适用于所有版本的技术是在 SQL 级别打开游标(请参阅 DECLARE...CURSOR),然后通过连续的 PQexec
调用从中获取游标,直到完成。这就是 FETCH_COUNT
在命令行工具 psql 中的实现方式。
它还有一个优点是,当游标打开并且程序仍在循环结果时,可以在同一连接上执行其他查询。