在尝试通过 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/