用于入口耦合的 Java 大列表方法



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

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

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

问题:

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


因此,我的方法似乎对内存(和运行时)太难了。
有什么更好的方法吗?

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

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

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

您可以根据

定义重复性的列将解析的行插入数据库中,而不是对内存中的行进行排序。

另一种方法是调度许多文件中的行,例如,每个文件被命名为定义重复性的串联列的 sha1 的前 2 个字符。因此,您永远不必读取多个文件即可进行最终操作,因为所有重复项都将在一起。

最新更新