用于存储重复行及其计数的数据结构

时间:2015-04-24 06:02:36

标签: java data-structures hashmap

我正在使用Java处理一个非常庞大的文件(包含数百万个小行。我需要处理的文件总大小约为200 GB)。我正在寻找存储重复行及其计数的最佳方法。例如,如果我的文件如下:

Chicago
New York
Chicago
LA
Chicago
LA

然后我想存储以下信息:

Chicago 3
New York 1
LA 2

我认为最好的方法是HashMap<String, Int>。但是,由于有数百万个值,在处理一条线时:我需要在地图中搜索该线是否已存在于地图中。如果是,那么我需要将计数增加1,然后处理下一行。

有没有更有效的方法来做到这一点?

4 个答案:

答案 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