如何处理来自大型 ResultSet 的数据而不将它们全部加载到内存中?

Posted

技术标签:

【中文标题】如何处理来自大型 ResultSet 的数据而不将它们全部加载到内存中?【英文标题】:How to process data from large ResultSet without loading them all to memory? 【发布时间】:2013-05-31 15:20:22 【问题描述】:

我的数据库托管在 mysql 服务器上,我正在使用 Java 来分析数据。

我的问题:执行“选择”查询后将返回 2.5 GB 的结果集。我不想将所有数据加载到内存中。那么有什么方法可以让我不断地检索数据并对其进行处理?

'limit by rows' 将不是一个选项,b/c 这 2.5 GB 的数据是从 4 个表中连接和检索的。所以“按行限制”会大大增加我的总运行时间。

我已经尝试过 statement.setFetchSize(50),但它似乎没有像我预期的那样工作。

任何建议将不胜感激!谢谢!

【问题讨论】:

我会增加你的堆大小。如果您需要处理 2.5 GB 的数据,那么拥有 8-32 GB 的内存听起来并不多。 你想看看这里:***.com/questions/2447324/… 【参考方案1】:

语句 stmt = readOnlyConn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);

stmt.setFetchSize(Integer.MIN_VALUE);

上面的代码解决了我的问题。感谢您的帮助!

【讨论】:

【参考方案2】:

BlockquoteStatement stmt = readOnlyConn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); stmt.setFetchSize(Integer.MIN_VALUE); 上面的代码解决了我的问题。感谢您的帮助!

是的,但是如果您使用的是 postgres,您还必须关闭自动提交! (工作 2 小时后实现 =D)

see postgres docs here

【讨论】:

嗨 Jaroslav,这并没有提供问题的答案 - 它确实属于对另一个答案的评论,但您需要获得更多声誉才能leave comments,所以在与此同时,您需要专注于发布高质量的原创答案和问题,以赢得声誉。

以上是关于如何处理来自大型 ResultSet 的数据而不将它们全部加载到内存中?的主要内容,如果未能解决你的问题,请参考以下文章

如何逐行读取大型文本文件,而不将其加载到内存中?

如何处理数据集中的空白单元格

如何处理大型但不是大数据的数据集?

如何处理大型mongodb集合

不知道如何处理大型数据库

GreenPlum 如何处理多个大型连接和同时工作负载?