是否有可用于Java的HashMap的并行处理实现?它甚至可能吗?

Eli*_*jah 3 java collections parallel-processing multithreading

正在寻找神奇的ParallelHashMap类

更简洁一点,您可以使用多个线程来加速HashMap查找吗?是否有任何实现已经执行此操作?

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

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

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

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

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

Chi*_*Chi 7

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

您是否已经分析了您的应用程序以证明hashmap确实是瓶颈?

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

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