为什么以下代码使用1.2GB内存来执行?无论传递给generate_series的数量是多少,我都希望内存使用量相对平稳,而不是稳定增长。请 - 告诉我我做错了什么!
if (!PQsendQuery(conn, "select generate_series(1, 10000000)"))
exit(1);
int i, value;
while (res = PQgetResult(conn)) {
for (i = 0; i < PQntuples(res); i++) {
value = atoi(PQgetvalue(res, i, 0));
}
PQclear(res);
}
printf("%d\n", value);
PQfinish(conn);
我已将此示例的完整源代码放在pastebin上。
答案 0 :(得分:4)
默认情况下,libpq似乎会缓冲整个结果,而不是以块的形式读取它。
在9.2中,有一种方法可以更改此行为,请参阅Single row mode。
我试过这个,在PQsendQuery()之后直接添加对PQsetSingleRowMode(conn)的调用,将内存使用量降低到几MB。问题解决了!
答案 1 :(得分:1)
处理可能较大的结果集的规范方法是为查询声明CURSOR并执行连续的FETCH调用以按块检索它们。
这也是设置psql
变量时FETCH_COUNT
所做的事情。