对于内存读/写,我是否应该期待与标准 Java Hashmap 相同的性能?

问题描述

我的用例是我需要在一个映射中存储数百万个符号,其中键是一个字符串,即

“IBM”

并且该值是一个 json 字符串,其中包含有关符号的信息,即

"{ "Symbol": "IBM","AssetType": "Common Stock","Name": "国际商用机器公司",}".

当使用持久化的 ChronicleMap 来存储其中的 2500 万个条目时,与标准 Java HashMap 相比,我得到了一些糟糕的性能

一些棒球场的数字……将 2500 万条记录插入 HashMap 需要大约 70 秒,而 ChronicleMap 需要大约 125 秒。从 HashMap 读取所有条目需要 5 秒,而在 ChronicleMap 上则需要 20 秒。

我将 averageKey/averageValue 设置为合理的设置,并且我慷慨地将条目大小设置为 5000 万,因为我看到其他帖子建议这样做。

我真的只是在问我对这里的期望是什么?与普通 HashMap 相比,上面的棒球场数字是否符合 ChronicleMap 应该具备的能力?

或者我将其视为普通的 HashMap 是错误的,实际上我输入的数据的大小意味着我将在使用标准 HashMap 和 ChronicleMap 之间获得不同的性能

解决方法

如果您要持久化数据,这似乎是合理的,HashMap 不会持久化。 ChronicleMap 能够提供更多的吞吐量。我会看看你使用了多少线程。

ChronicleMap 不是普通的 HashMap,因为它在堆外存储数据的副本,因此它对 GC 没有影响。但是,每种方式都有一个副本成本。理想情况下,您会将数据存储为 Java 对象而不是 JSon,但它应该仍然可以工作。