处理大量java对象

nvbavucw  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(365)

我正在尝试处理从配置单元表导入的大量行(数亿行)。作为产出,它将更多。如果某些条件有效,我需要生成新行。但这不是问题。问题是如何存储这些配置单元行。此时,我使用arraylist of objects,因为顺序对于插入新行的算法非常重要,但是我得到了一个“超出了gc开销限制”。

qni6mghb

qni6mghb1#

您应该一次将一页结果检索到新的arraylist中,处理该结果页中的行,根据需要写入新行,然后将下一个结果页加载到新的arraylist中。垃圾收集(gc)将清理旧的arraylist。
结果的排序应该在数据库查询中使用“orderby”子句。
如果要插入到同一个表中,并且希望避免重新处理要添加的行,则需要在表上设置一列以区分新行和现有行,例如自动递增的“id”或“date\u created”。

xfyts7mz

xfyts7mz2#

我正在尝试处理从配置单元表导入的大量行。。。但我得到一个“gc开销限制超出”。
你有几个选择。正如@darrenkennedy提到的,如果有某种方法一次只处理一个页面,那么这将是最佳的,但是由于自定义排序,听起来这不是一个选项。
所以你有两种可能:
增加内存大小以适应所有行。我怀疑这也不是一个选择,但我想我应该说出来。
在内存中处理批处理,将其写入磁盘,然后在最后处理批处理文件。见下文。
要成批处理,您需要读取一组可以轻松放入内存的输入行,对它们进行排序和筛选,然后将每一组写入它们自己的本地临时文件。如果您使用云系统来实现这一点,那么临时存储将非常适合。
一旦处理完所有的配置单元输入行,对它们进行排序并将它们写入一堆临时文件,那么您就需要返回并执行插入排序来读取和处理排序后的行。下面是一些伪代码:
打开所有临时文件使用 BufferedReader 或者类似的。
读入所有文件的第一行。
输出所有临时文件的最低行。从该文件中读取下一行。
重复此操作,直到处理完所有临时文件。
关闭并删除临时文件。
希望这有帮助。

相关问题