Java 用于存储重复行及其计数的数据结构
我正在使用Java处理一个非常大的文件(包含数百万条小的行。我需要处理的文件的总大小约为200 GB)。我正在寻找存储重复行及其计数的最佳方法。例如,如果我的文件如下所示: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,然后处理下一行 有
Chicago
New York
Chicago
LA
Chicago
LA
然后我要存储以下信息:
Chicago 3
New York 1
LA 2
我认为最好的方法是HashMap
。但是,由于有数百万个值,因此在处理一行时:我需要搜索地图,看地图中是否已经存在该行。如果是,那么我需要将计数增加1,然后处理下一行
有没有更有效的方法呢?- 地图上:
- 存档:
您需要为一个键(行)存储一个值(计数),这样就不能避免使用类似于映射的结构。您还需要检查文件中的每一行,以便知道该行是否已存储/读取。所以你必须一个接一个地解析它们我认为这是实现目标最有效的方法。无需额外搜索,只需读取并递增:
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