入门耦合的Java大列表方法

时间:2012-06-26 15:41:05

标签: java sorting arraylist

文件:
我正在使用包含3.3mio数据行的精简csv版本的searchlog文件,每行包含一个查询并包含有关该查询的各种数据。 文件中的条目按会话/用户ID递增排序。

目标:
耦合在属于同一用户标识时提交相同queryterm的条目

的方法:
我正在逐行读取csv文件,将数据保存在自制的“Entry”对象中,并将这些对象添加到arraylist中。完成后,我将使用自定义比较器

按两个条件对列表进行排序

问题:

在读取行并将Entry对象添加到列表中时(这需要很长时间),程序终止时出现OutOfMemoryException“Java heap”


所以我的方法似乎在内存(和运行时)上太难了 有什么想法可以提供更好的方法吗?

2 个答案:

答案 0 :(得分:2)

您的方法本身可能是有效的,也许最简单的解决方案是简单地增加JVM可用的内存。

JVM只会为自己分配最大量的系统内存,您可以通过-Xmx命令行属性增加此值。有关详细信息,请参阅here

显然这个解决方案不能扩展,如果(将来)你想要阅读更大的文件,那么你可能需要一个更好的解决方案来阅读这些文件。

答案 1 :(得分:1)

您可以将解析后的行插入数据库中,而不是对内存中的行进行排序,而是使用基于定义双重性的列的索引。

另一种方法是在许多文件中分派行,每个文件被命名,例如,作为定义双重性的连接列的sha1的前2个字符。因此,您永远不必为最终操作读取多个文件,因为所有重复数据都将在一起。