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

Java 用于存储重复行及其计数的数据结构,java,data-structures,hashmap,Java,Data Structures,Hashmap,我正在使用Java处理一个非常大的文件(包含数百万条小的行。我需要处理的文件的总大小约为200 GB)。我正在寻找存储重复行及其计数的最佳方法。例如,如果我的文件如下所示: Chicago New York Chicago LA Chicago LA 然后我要存储以下信息: Chicago 3 New York 1 LA 2 我认为最好的方法是HashMap。但是,由于有数百万个值,因此在处理一行时:我需要搜索地图,看地图中是否已经存在该行。如果是,那么我需要将计数增加1,然后处理下一行 有

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

Chicago
New York
Chicago
LA
Chicago
LA
然后我要存储以下信息:

Chicago 3
New York 1
LA 2
我认为最好的方法是
HashMap
。但是,由于有数百万个值,因此在处理一行时:我需要搜索地图,看地图中是否已经存在该行。如果是,那么我需要将计数增加1,然后处理下一行

有没有更有效的方法呢?

  • 地图上:
我需要搜索地图,看那条线是否已经出现在地图上。如果是,那么我需要将计数增加1,然后处理下一行

有没有更有效的方法

实际上,由于工作方式的原因,检查“地图中是否已经存在该线”是一个非常快速的操作(实际上是一个常量):

此实现为基本的 操作(get和put),假设散列函数分散 在桶之间正确地放置元素

  • 存档:

您需要为一个键(行)存储一个值(计数),这样就不能避免使用类似于映射的结构。您还需要检查文件中的每一行,以便知道该行是否已存储/读取。所以你必须一个接一个地解析它们

我认为这是实现目标最有效的方法。无需额外搜索,只需读取并递增:

Integer count = map.get(word);
map.put(word, count == null ? 1 : ++count);
使用ConcurrentHashMap执行相同操作的速度不是更快,而是更短的方法:

m.compute(word, (k, v) -> v == null ? 1 : v + 1);

HashMap还可以,但由于您的数据太大,我建议您使用NoSQL解决方案,例如HBase。

由于文件太大,应该是一个很好的集合。这将显著减少您的处理(get/put)。

抱歉,我没有使用正确的术语。“搜索”是指使用
get()
方法。所以基本上,我所做的是有效率的!不应该是:
map.put(word,count==null?1:++count)
?@作者和任何好奇的人:HashMaps实际上是哈希表-这是使用哈希函数作为键的类似map数据结构的通用名称(与语言/技术无关)。因此,如果您想了解哈希映射如何工作的更多细节,请搜索HT