0

文件:
我正在使用搜索日志文件的精炼 csv 版本,其中包含 3.3mio 行数据,每行类似于单个查询并包含有关该查询的各种数据。文件中的条目按会话/用户 ID 升序排序。

目标:
耦合提交相同查询词但属于相同用户标识的条目

方法:
我正在逐行读取 csv 文件,将数据保存在自制的“条目”对象中,并将这些对象添加到数组列表中。完成后,我将使用自定义比较器按两个标准对列表进行排序

问题:

在读取行并将条目对象添加到列表时(这需要很长时间),程序以 OutOfMemoryException "Java heap" 终止


所以看来我的方法在内存(和运行时)上太难了。
有更好方法的想法吗?

4

2 回答 2

2

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

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

显然,此解决方案无法扩展,如果(将来)您想要读取更大的文件,那么您可能需要更好的解决方案来读取这些文件。

于 2012-06-26T15:44:10.440 回答
1

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

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

于 2012-06-26T15:44:41.590 回答