处理大量的行/ chunked / unbuffered

时间:2016-06-11 09:17:59

标签: c++ mysql mysql-connector

考虑使用MySQL Connector / C ++读取大表的所有行:

std::unique_ptr<sql::ResultSet> res(
                 stmt->executeQuery("SELECT a, b FROM table"));
while (res->next()) {
    handle(res->getUInt64(1), res->getDouble(2));
}

来自documentation

  

在撰写本文时,MySQL Connector / C ++返回缓冲结果   Statement个对象。缓冲的结果集缓存在客户端上。   无论结果有多大,驱动程序总是会获取所有数据   设置是。预计连接器的未来版本将返回   Statement对象的缓冲和无缓冲结果。

这符合我的观察。在较小的表(~1e8行)上,它需要在第一个handle之前3分钟,其余的在7秒内完成。对于较大的表(~1e10行),它只会在内存不足之前继续吞噬更多内存。

如何在没有内存耗尽的情况下处理此类查询,同时使用简洁的代码实现合理的效率?

我必须说我很难相信应该没有透明的解决方案。在MySQL层中对结果进行分块流式传输似乎是一种明显的优化。

注意:handle在库中,比MySQL服务器提供的数据快得多。它必须按自然顺序处理行,因此无法并行化。

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法(不完全透明)是在客户端上进行分块,因此获取总行数并在查询中使用LIMIT关键字并结合循环来启动对块的多个查询具有可接受的内存使用量的大小您必须确保表格内容在此期间没有变化才能够做到。