文件:
我正在使用包含3.3mio数据行的精简csv版本的searchlog文件,每行包含一个查询并包含有关该查询的各种数据。
文件中的条目按会话/用户ID递增排序。
目标:
耦合在属于同一用户标识时提交相同queryterm的条目
的方法:
我正在逐行读取csv文件,将数据保存在自制的“Entry”对象中,并将这些对象添加到arraylist中。完成后,我将使用自定义比较器
问题:
在读取行并将Entry对象添加到列表中时(这需要很长时间),程序终止时出现OutOfMemoryException“Java heap”
所以我的方法似乎在内存(和运行时)上太难了 有什么想法可以提供更好的方法吗?
答案 0 :(得分:2)
您的方法本身可能是有效的,也许最简单的解决方案是简单地增加JVM可用的内存。
JVM只会为自己分配最大量的系统内存,您可以通过-Xmx
命令行属性增加此值。有关详细信息,请参阅here。
显然这个解决方案不能扩展,如果(将来)你想要阅读更大的文件,那么你可能需要一个更好的解决方案来阅读这些文件。
答案 1 :(得分:1)
您可以将解析后的行插入数据库中,而不是对内存中的行进行排序,而是使用基于定义双重性的列的索引。
另一种方法是在许多文件中分派行,每个文件被命名,例如,作为定义双重性的连接列的sha1的前2个字符。因此,您永远不必为最终操作读取多个文件,因为所有重复数据都将在一起。