tmn*_*tmn 5 java collections hashmap guava
我正在与一位同事进行一些测试,我们从数据库中提取数据(大约350,000条记录),将每条记录转换为一个对象和一个关键对象,然后将它们填充到ImmutableMap.Builder中.
当我们调用build()方法时,它花了很长时间,可能是由于ImmutableMap(dupe keys,nulls等)附带的所有数据完整性检查.公平地说,我们也试图使用一个hashmap,这需要一段时间但不像ImmutableMap那么长.我们最终决定只使用ConcurrentHashMap,当迭代记录时,我们填充了9个线程,并将其包装在一个不可修改的映射中.表现很好.
我在文档中注意到它读取的ImutableMap没有针对"equals()"操作进行优化.作为一个顽固的不可变因素,我希望ImmutableMap适用于大数据量,但我觉得它并不适合它.这个假设是对的吗?它是否仅针对中小型数据集进行了优化?我需要通过"copyOf()"或其他东西调用隐藏的实现吗?
我的经验是,Java 的内置Collection类都没有真正针对大容量时的性能进行优化。例如,一旦 hashCode 被用作数组中的索引,HashMap 就会使用简单的迭代,并将键equals与具有相同散列的每个项目进行比较。如果您要在地图中存储数百万个项目,那么您需要设计良好的哈希和大容量。这些类被设计得尽可能通用和安全。
因此,如果您希望坚持使用标准 Java HashMap,请尝试进行性能优化:
HashMap就会扩充很多倍。理想情况下,将初始容量设置为尽可能接近最终值。equals实施尽可能高效。如果您知道(例如)您的密钥是一个整数,则可以应用大量的性能优化,例如在应用哈希后使用某种形式的 btree 并使用而==不是equals.
因此,简单的答案是,我相信您需要编写自己的集合才能获得您想要的性能,或者使用可用的更优化的实现之一。
| 归档时间: |
|
| 查看次数: |
445 次 |
| 最近记录: |