java - 是否有可用于 Java 的 HashMap 的并行处理实现?有可能吗?

标签 java multithreading collections parallel-processing

寻找神奇的 ParallelHashMap 类

更简洁一点,可以使用多线程来加速HashMap的查找吗?是否已经有任何实现可以做到这一点?

在我的项目中,我们需要在内存中维护一个大的对象图。我们从不在 map 创建后对其进行修改,因此该 map 是严格只读的。但是,此 map 上的读取和查找性能对于应用程序的成功绝对至关重要。将安装应用程序的系统通常有许多可用的硬件线程。然而,我们的查找仅使用单个线程从 HashMap 中检索值。使用多个线程(可能在池中)的分而治之方法是否有助于提高查找速度?

我的大多数谷歌搜索都没有结果 - 返回了很多关于并发问题而不是解决方案的结果。任何建议将不胜感激,但如果您知道开箱即用的解决方案,那您就太棒了。

另外值得注意的是,所有键和值都是不可变的。哈希码值在实例化时预先计算并存储在对象本身中。

至于实现的细节, map 中有大约 35,000 个项目。键和值都是对象。键是自定义查找键,值是字符串。目前,我们每秒最多可以处理大约 5,000 次查找(这包括一些其他逻辑的开销,但主要瓶颈是 map 实现本身)。但是,为了跟上我们 future 的性能需求,我希望这个数字达到每秒大约 10,000 次查找。按照大多数正常标准,我们当前的实现速度很快 - 只是我们需要它更快。

在我们的 35,000 个值的 Map 中,我们平均有大约一次哈希码冲突,所以我猜测哈希码分布合理。

最佳答案

因此您的哈希码是预先计算的并且 equals 函数很快 - 在这种情况下您的 HashMap 获取应该非常快。

您是否分析过您的应用程序以证明 hashmap 获取确实是瓶颈?

如果您有多个应用程序线程,它们都应该能够同时从散列图中执行它们自己的获取 - 因为您没有修改映射,所以不需要在外部同步获取。使用 hashmap 的应用程序是否具有足够的线程以能够利用所有硬件线程?

由于哈希表的内容是不可变的,因此可能值得研究 perfect hashing - 使用完美的散列函数,您永远不应该在散列表中发生冲突或需要链接,这可能会提高性能。我不知道手头有 java 实现,但在 C/C++ 中知道,有 gperf

关于java - 是否有可用于 Java 的 HashMap 的并行处理实现?有可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1381898/

相关文章:

java - JMenuItem 显示奇怪的名称

android - 如何在android中停止这个线程?

python - 如何在python中实现非阻塞套接字服务器

java - 如何在电子表格 controlsfx 的 GridBase 的 setCellValue 方法中迭代 List<String> 中的值?

list - 为什么::仅适用于列表?

java - 基于另一个数组递增数组中的值

java - 如何将 Java Hashtable 转换为 NSDictionary (obj-C)?

java - 如何找到存储在链表中的值而不是存储在 HashMap 中的值

java - join() 不会阻塞其他线程(主线程除外)?

java - Scala HashMap containsValue 方法