处理大量的java对象

时间:2017-05-08 19:36:14

标签: java hive garbage-collection out-of-memory bigdata

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

2 个答案:

答案 0 :(得分:0)

您应该一次检索一页结果到新的ArrayList,处理该结果页面中的行,根据需要编写新行,然后将下一个结果页面加载到新的ArrayList中。垃圾收集(GC)将清理旧的ArrayList。

结果的排序应该是数据库查询中的“ORDER BY”子句。

如果要插入同一个表并且想要避免重新处理要添加的行,那么您需要在表上使用一列来区分新行和现有行 - 例如自动递增的“id”或“DATE_CREATED”。

答案 1 :(得分:0)

  

我正在尝试处理从hive表导入的大量行...但是我得到了“超出GC开销限制”。

你有几个选择。正如@DarrenKennedy所提到的,如果某种方法一次只能处理一个页面,那么这将是最佳的,但听起来这不是一个选项,因为自定义排序。

所以你有两种可能性:

  • 增加内存大小以适合所有行。我怀疑这也不是一个选择,但我想我会说出来。

  • 在内存中处理批处理,将其写入磁盘,然后在最后处理批处理文件。见下文。

要批量处理,您需要读取一堆输入行,这些输入行可以很好地适应内存,对它们进行排序和过滤,然后将每个串写出自己的本地临时文件。如果您正在使用云系统,那么短暂的存储将是非常好的。

处理完所有配置单元输入行后,将它们排序并写入一堆临时文件,然后您需要返回并读取并处理执行插入排序的已排序行。这是一些伪代码:

  1. 使用BufferedReader或其他类似文件打开所有临时文件。
  2. 读入所有文件的第一行。
  3. 输出所有临时文件中的最低行。阅读该文件的下一行。
  4. 重复,直到处理完所有临时文件为止。
  5. 关闭并删除临时文件。
  6. 希望这有帮助。