[英]Find word frequency from huge text file using self-balancing immutable Binary Search Tree in Java?
我试图了解如何实现BST,该BST将读取巨大的文本文件并在Java中存储每个单词的出现频率? 我还试图使其以多线程方式工作,所以我相信我也必须使其具有线程安全性!
编辑:谢谢您的回答。 但是我正在寻找Java代码,其中我们在不使用库的情况下构造BST以及添加上述功能。
只需使用从String到AtomicInteger
或LongAdder
的ConcurrentMap
LongAdder
。 第一次找到时添加单词,然后增加整数。 在Java 8中,您可以使用computeIfAbsent
作为1-liner来执行此操作,或者在较早的版本中,可以使用putIfAbsent
。 无论哪种情况,最好都是先通过get
调用检查count对象是否已经存在,因为可以修改映射的方法比较慢-即使它们没有添加到映射中。 如果初始快速路径get()
返回任何现有元素,则继续进行...ifAbsent
调用:
for (String word : words) {
AtomicInteger count = chm.get(word);
if (count == null) {
if ((count = chm.putIfAbsent(word, new AtomicInteger(1))) == null) {
continue;
}
}
count.incrementAndGet();
}
这将是快速且并行的。 您可以在顶层将文件拆分为多个块,然后在不同的线程上处理每个块。
那就是如果您坚持使用共享结构进行计数。 让每个线程将其计数保存在私有HashMap
,然后通过对映射求和来减少每个线程的结果,可能会更快一些。
也许您应该将文件拆分为多个块,使用非线程安全算法在不同线程上处理每个块,然后合并结果。 您将不会遭受同步惩罚。 或仅使用单线程导致瓶颈不是处理器而是硬盘。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.