使用大型Resultset

时间:2015-06-05 13:45:46

标签: java postgresql

我正在尝试编写一个可以处理大型结果集的java函数 该表有12亿行,即189 Gb的数据 目前,我查询所有数据并提取我存储在各自对象中的信息。(使用百万行样本数据库)

my_first_table

使用189 Gb数据时,我的计算机内存将无法保存信息 我从来没有碰过一个有十亿+行的表格,而我的一些方法涉及所有的表格属性

  • 我可以让Resultset一次收集1,000,000个查询,然后在我运行函数后删除对象 - >然后再收集1,000,000等等
  • 是否可以保存大约12亿行的结果集。 43,000,000个船只物体(它会占用太多空间/时间吗?)
  • 我是否尝试通过选择特定密钥或属性并在指定数据上运行函数来限制查询?
  • 还有其他选择吗?

2 个答案:

答案 0 :(得分:1)

从您的代码中,您似乎正在构建一个java对象,该对象使用相同的mmsi字段收集alla坐标。您没有提供有关此对象(mmsi及其坐标列表)用法的信息。根据这些信息,您可以通过mmsi查询数据排序,然后查询时间戳(您的order by子句现在仅通过时间戳),当您在结果集中找到mmsi的不同值时,您收集了有关特定mmsi的所有数据,以便您可以使用它没有阅读其他数据。 我认为你真的不需要在内存中获取所有数据;您可以重写查询,以便只获得固定(滑动窗口)数量的Vessel对象;你必须分页数据(即从位置x的船只开始检索10个容器的块)

为了提供更详细的回复,您必须解释您对船只所做的事情。

答案 1 :(得分:0)

如果内存是ResultSet的问题,您可以设置提取大小,但在提取过程中您需要清除对象,以确保不会耗尽内存。
使用Postgres,您需要关闭自动提交或不会出现提取大小。

connection.setAutoCommit(false);
            Statement stmt = connection.createStatement(); 
            stmt.setFetchSize(fetchsize);

您可以在https://jdbc.postgresql.org/documentation/94/query.html#query-with-cursor

了解有关缓冲结果集的更多信息
相关问题