我正在使用 Chronicle Map 临时存储/查找大量 KV 对(实际上是数十亿)。我不需要持久性或复制,我使用的是内存映射文件,而不是纯粹的堆外内存。平均密钥长度为 8 个字节。
对于较小的数据集 - 最多 2 亿个条目 - 我每秒获得大约 100 万个条目的吞吐量,即创建条目大约需要 200 秒,这是惊人的,但是通过 4 亿个条目,地图已经显着放慢并且需要创建它们需要 1500 秒。
我已经在 Mac OSX/16GB 四核/500GB SSD 和 Proliant G6 服务器上运行了 8 核/64GB ram/300GB Raid 1(不是 SSD)的 Linux 的测试。在两个平台上都表现出相同的行为。
如果有帮助,这是地图设置:
try {
f = File.createTempFile(name, ".map");
catalog = ChronicleMapBuilder
.of(String.class, Long.class)
.entries(size)
.averageKeySize(8)
.createPersistedTo(f);
} catch (IOException ioe) {
// blah
}
还有一个简单的作家测试:
long now = -System.currentTimeMillis();
long count = 400_000_000L;
for (long i = 0; i < count; i++) {
catalog.put(Long.toString(i), i);
if ((i % 1_000_000) == 0) {
System.out.println(i + ": " + (now + System.currentTimeMillis()));
}
}
System.out.println(count + ": " + (now + System.currentTimeMillis()));
catalog.close();
所以我的问题是 - 我可以做一些调整来改善这一点,例如更改段数,使用不同的键类型(例如 CharSequence),或者这仅仅是操作系统分页如此大文件的人工制品?