问题标签 [koloboke]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 多键映射 - 性能比较
语境
我们的应用程序将大量数据存储在内存中的许多不同类型的地图中,以允许快速查找。为了简单起见(不考虑原始地图),它始终是带有一个或多个键的地图。性能对我们来说是一个很大的要求。
问题
我想找到性能最高的地图实现,并按照这里的建议,比较了这些实现:
基于 java.util.HashMap 的 Maps Maps (Nested Maps) 专门用于 3 个键:
/li>java.util.HashMap 中的包装键(元组作为键)
/li>元组作为 net.openhft.koloboke.collect.map.hash.HashObjObjMap 中的键,根据这个应该是最快的映射(之一)。
/li>
期望
- 嵌套地图将具有最快的 GET 和最慢的 PUT。
- Koloboke hash map 会比 jdk HashMap 快。
结果
基准
注意:请不要建议使用原始地图。Integer as (value) 只是廉价对象的一个例子。
问题
- 为什么koloboke地图比jdk地图慢2.5倍?
- 为什么嵌套地图不更快?(我希望元组键对象的分配开销会更大。)
- 还是我的基准错误?那么,我该如何改进呢?
更新
根据@leventov 的好建议,我更改了基准测试并尝试了缓存哈希码(并且具有更好的分布)的 Triple 实现 - 测试被命名为 Tuple2。
结果是这样的:
概括
- 如果键类的哈希码函数没有被缓存和/或分布良好,“元组”方法可能会变得非常慢,尤其是对于 koloboke。
- 正如这里所得出的结论(在这个(Obj-Obj)案例中),java.util.HashMap 是“非常”快的。
java - 在修改 Koloboke Hashmap 时对其进行迭代
我有一个大的哈希图(~3M 条目)并且正在使用 KolobokeLongIntMap
来实现它。我需要迭代地图中的键,但能够沿途修改地图。一些修改可能是结构性的(添加/删除条目)。
除非绝对必要,否则我不想为同步实现或复制的密钥列表付出代价。我知道迭代结果或多或少是随机的,遗漏了一些键,可能两次取其他键,这在我们的应用程序中不是问题。
有没有办法实现这样的地图迭代?提前感谢您的任何意见。
java - Java HashObjObjMap与哈希图
HashObjObj<K, V>
Koloboke和 Java util有什么区别HashMap<K, V>
?
我知道 Koloboke 提供的性能,但可能存在 K/V 变成整数/长整数的情况。一般来说,如果已知HashLongObjMap
会被推荐,但是当 K/V 作为泛型出现时会发生什么。据我了解,HashLongObjMap
使用long
原语作为键,但使用时有什么区别HashObjObjMap<Long, V>
?
例如:
HashLongObjMap<V> map1 = HashLongObjMaps.newImmutableMap();
VS
HashObjObjMap<K, V> map2 = HashObjObjMaps.newImmutableMap();
redis - 编年史地图 vs Redis vs Koloboke
我们有一个系统,其中在 50 台服务器上使用相同的数据集(键值对)。该数据集的更新次数约为每小时 1000 次,并且必须在这 50 台服务器之间进行复制。我们有一个主系统接收这些更新并负责将这些更新传播到其他服务器。目前,我们每小时以文件的形式将整个数据集(而不是增量更新)同步到所有服务器。然后将此数据加载到不可变的 Koloboke 地图中。每个服务器每秒处理大约 25000 个请求,每个请求对该映射进行 30 次查找。在这些服务器上接收到的请求的平均响应延迟必须最大约为 3 毫秒,因此内存中的 koloboke 映射可以很好地维护这个响应时间。
但是,我们当前跨服务器同步此数据的系统会导致问题:
1) 通常情况下,此关键数据的同步在其中一台服务器上失败,从而导致收入损失
2)由于这个数据是存储在内存中的,它不是持久化的,每次服务器重启或者每小时更新一次,我们都需要重新加载这个数据,这会影响应用程序的启动时间。
为了提高效率,我探索了 Koloboke 库中的 Redis、Chronicle Maps 和 Mutable maps。但是我遇到了所有这些限制:
Redis:Redis 支持复制和持久化。然而,在使用它的基准测试实用程序时,我发现它可以支持的查找数量仅略高于我们的平均用例(0.8-11 万个请求与 75 万,这是我们每秒的查找数量)。此外,对 redis 的调用将通过网络进行,这会损害我们 3 毫秒的平均响应时间。
Chronicle Maps:在进一步探索这一点时,我发现 Chronicle Maps 支持复制、持久性,并且每秒可以处理多达 3000 万个请求。乍一看,这似乎是一个不错的选择,但后来我发现它们不适用于多图,我们在应用程序中生成了它们。此外,它们在堆外存储数据,因此数据反序列化的成本会导致性能下降。
Koloboke:它的性能很好,服务于我们的用例,但不支持复制和持久化。
我找不到任何支持我们所有用例的东西。我正在寻找来自这个社区的建议,这些建议可以帮助我们有效地构建这个系统,而不会对性能产生任何严重的影响。对此的任何帮助将不胜感激!谢谢!
java - 在 Koloboke 集之间复制时的性能问题
由于执行迭代和添加新条目的方式,如果一个迭代一组并复制到另一组,则性能非常慢。考虑以下代码片段:
在这种情况下,有什么方法可以加速第二组的人口?我知道如果我预先知道预期的集合大小,我可以在第二个集合构造中使用它并让事情变得更快——但这并不总是可能的——我可以在确定值需要哪个输出集合之间插入一些条件插入或完全丢弃。
java - 创建 koloboke 地图时出现异常。(内部运行时错误)java.util.NoSuchElementException
我在尝试创建 koloboke 地图时遇到了以下异常。我的地图是这样的
运行时异常。
我在这里看到了一个类似的问题,https://github.com/leventov/Koloboke/issues/34。修复是在类路径中同时包含 api 和 impl jar。我通过使用System.getProperty("java.class.path")
在类路径中显示两个 jar 来验证我的类路径。
谁能帮我解决这个问题?
java - 需要优化的 Map(k,v) 例如 (long, long[]),以避免自动装箱
我有一段代码,基本上如下:
这些值是按顺序填写的,即
if ids = ['id1','id2',...]
这些值可能是values = [['id2val1','id2val2',..]['id1val1','id2val2',...],..]
无法避免不按顺序执行的,我正在考虑的方法是使用 Map
Map<Long,Long[]>
,
但由于 java 的自动装箱,不可能使用 JAVA 泛型。
我想知道它是否可以通过一些使用原语的优化数据结构库来完成,
以避免不必要的自动装箱,我正在寻找像Koloboke
&之类的库Fastutil
。
寻找数据结构推荐