我正在使用Java处理一个非常庞大的文件(包含数百万个小行。我需要处理的文件总大小约为200 GB)。我正在寻找存储重复行及其计数的最佳方法。例如,如果我的文件如下:
Chicago
New York
Chicago
LA
Chicago
LA
然后我想存储以下信息:
Chicago 3
New York 1
LA 2
我认为最好的方法是HashMap<String, Int>
。但是,由于有数百万个值,在处理一条线时:我需要在地图中搜索该线是否已存在于地图中。如果是,那么我需要将计数增加1,然后处理下一行。
有没有更有效的方法来做到这一点?
答案 0 :(得分:3)
我需要在地图中搜索地图中是否已存在该行。如果是,那么我需要将计数增加1,然后处理下一行。
有没有更有效的方法来做到这一点?
实际上,检查&#34;地图中是否已存在该行&#34;由于HashMaps
的工作方式,所以操作速度非常快(实际上是一个常数):
此实现为基本提供了恒定时间性能 操作(获取和放置),假设散列函数分散了 桶中的元素。
您需要存储键(行)的值(计数),这样您就可以避免使用类似地图的结构。您还需要检查文件中的每一行,以便了解是否已存储/读取该类行。所以你必须逐个解析它们
答案 1 :(得分:1)
我认为这是实现目标的最有效方式。无需额外搜索,只需阅读和增加:
Integer count = map.get(word);
map.put(word, count == null ? 1 : ++count);
使用ConcurrentHashMap不是更快但是更短的方式:
m.compute(word, (k, v) -> v == null ? 1 : v + 1);
答案 2 :(得分:1)
由于文件大小非常大,ConcurrentHashMap应该是一个很好的集合。它会显着减少你的处理(获取/放置)。
答案 3 :(得分:0)
HashMap 没关系,但由于你的数据量太大,我建议你选择NoSQL解决方案,例如 HBase 。