问题标签 [chronicle-map]

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.

0 投票
1 回答
483 浏览

scala - Chronicle Map 中的 Kryo 序列化 - 缓慢的字节读取

我在 Scala 中广泛使用 Chronicle Map,最近决定尝试 Kryo 序列化。我添加了自定义编组器(下面的代码),虽然它将我的商店大小减少了 14G(大约 62%),并且一切仍然正常,但速度令人无法接受。

我创建了一个示例用例并对相同的数据进行了几次运行

所以它慢了好几倍。这是用于阅读的编组器:

然后我平均了这三个阶段的执行时间(以毫秒为单位),并意识到读取字节是最慢的:

现在的问题是——我做错了什么?

我查看了界面,Bytes[_]它看起来像是一个一个地读取字节 - 有没有办法使用缓冲区或能够神奇地批量加载的东西?

更新:最终我将数组分配+读取字节更改为in.toByteArray但它仍然很慢,因为它在引擎盖下一个接一个地复制字节。仅在地图上运行读取表明字节读取是瓶颈:

JProfiler 的基准测试

0 投票
1 回答
746 浏览

java - 填充具有高度可变性值大小的 ChronicleMap 时出现 IllegalArgumentException

不久前,我问了这个关于 ChronicleMap 被用作Map<String,Set<Integer>>. 基本上,我们有一个集合,其平均值Set<Integer>可能为 400,但最大长度为 20,000。在 ChronicleMap 2 中,这导致了相当严重的 JVM 崩溃。我搬到了 ChronicleMap 3.9.1 并且现在已经开始出现异常(至少它不是 JVM 崩溃):

我怀疑这仍然是因为我的值与平均值相差甚远。我假设 ChronicleMap 根据我给构建器的平均值确定最大块数为 6328,但没想到会有一个需要 23045 个块的巨大值。

所以我的问题是:解决这个问题的最佳方法是什么?我正在考虑的一些方法,但仍然不确定:

  1. 使用ChronicleMapBuilder.maxChunksPerEntryChronicleMapBuilder.actualChunkSize。也就是说,我如何确定性地确定应该设置什么?此外,如果设置得太高,这可能会导致大量碎片和性能下降,对吧?
  2. 有一个“最大集合大小”并将非常大的集合分成许多较小的集合,相应地设置密钥。例如,如果我的密钥XYZ产生Set<Integer>大小为 10000 的密钥,也许我可以将其拆分为 5 个密钥XYZ:1XYZ:2等,每个密钥的大小为 2000。这感觉就像我可以在 ChronicleMap 中配置的东西一样,并且导致很多代码感觉它不应该是必要的。我在另一个问题中也提到了同样的计划。

其他想法/想法表示赞赏!

0 投票
1 回答
478 浏览

java - 为什么 ChronicleMap 不使用 hashCode 或 equals 来查找键?

正如您在上面的示例中所见,ChronicleMap 的行为与 ConcurrentHashMap(与 HashMap 相同)有点不同,因为它无法使用 hashCode 或 equals 查找键。

有人可以指出可以做些什么来解决这个问题吗?

更新; 执行时,程序将返回以下结果:

0 投票
1 回答
694 浏览

chronicle - 编年史地图可以处理大于内存的数据吗?

我对堆外内存的工作方式有点困惑。我有一台具有 32GB 内存的服务器和一个大小约为 1TB 的键值映射数据集。我正在寻找一个简单快速的嵌入式 Java 数据库,它允许我根据这个 1TB 数据集将键映射到一个值,该数据集大部分必须从磁盘读取。该数据集中的每个条目都很小(<500 字节),所以我认为使用文件系统会效率低下。

我想为此使用编年史地图。我读到堆外内存使用可能超过内存大小,并且它以某种方式与文件系统交互,但同时,Chronicle Map 被描述为内存数据库。Chronicle Map 可以为我的服务器处理 1TB 数据集,还是我只能使用 32GB 或更少的数据集?

0 投票
1 回答
375 浏览

java - 使用 ChronicleMap.put 时如何避免创建新的字节数据实例

我正在学习如何通过使用 Byteable 键和值类来使用 ChronicleMap 3.12。当我使用基于调用堆栈的 ChronicleMap.put 操作循环运行我的代码时,似乎每次调用 ChronicleMap.put 时都会创建一个值对象。我会假设使用 Byteable 值类将阻止对象创建。有人能告诉我我是否可能做错了什么吗?

创建 ChronicleMap 的代码(TestDataKeyForChronicleMap 和 TestDataForChronicleMap 都是 Byteable):

我运行 ChronicleMap.put 时的调用堆栈

谢谢。

更新以包括 TestDataKeyForChronicleMap:

TestDataForChronicleMap 的代码:

put循环的代码:

TestDataMap 接口

和 TestDataMapForChronicleMap

测试数据代码

0 投票
1 回答
166 浏览

java - Chronicle Map 2 containsKey 不起作用

我有以下地图定义,其中 map.containsKey() 显然不起作用:

我使用 Chronicle Map 2.4.17,在我的项目中迁移到版本 3 太难了。

在输入带有键“abc”的条目后,containKey() 方法为键“abc”返回 false。我很困惑为什么它不起作用。String 类型是具有正确 hashCode() 方法的默认 Java 字符串。

0 投票
1 回答
535 浏览

chronicle-map - 如何使用 Chronicle-map 而不是 redis 作为数据缓存

我打算用chronicle-map代替redis,应用场景是memoryData模块每天从数据库启动加载上亿条记录到chronicle-map,几十个jvm不断读取chronicle-map记录。每个 jvm 都有数百个线程。但可能是因为对chronicle-map缺乏了解,代码性能不佳,运行速度较慢,直至内存溢出。不知上面的做法是不是chronicle-map的正确使用。

0 投票
1 回答
783 浏览

java - 使用编年史地图和 byte[] 或字节缓冲区

我正在尝试使用 Long 键和可变大小的 byte[] 创建一个 Chronicle 映射,准确地说是一个序列化的 Java BitSet。我可以使用 Values 接口创建地图,但其中的数组大小是固定的。

因此,我希望使用 byte[] 或 Bytebuffer,因为它们是动态调整大小的,因此可以节省内存。这是受支持的用例吗?是否有使用带有 byte[] 或 ByteBuffer 值类的编年史地图的示例?以下代码失败

出现错误:

我尝试使用 Values.newHeapInstance 创建值对象,但失败并出现错误:

文档说 byte[] 和 ByteBuffer 支持开箱即用,但我找不到它的工作示例,所以决定在这里询问。

0 投票
1 回答
1031 浏览

java - java Chronicle Map - JavacTool java.lang.ClassNotFoundException

尝试基于 ChronicleMap API 执行 myApp:

并得到例外。

这是我的配置:

安装操作系统:Windows 10

已安装 Java:JDK 1.8.0_131

Java 路径:C:\Program Files\Java\jre1.8.0_131\bin\javaw.exe

ChronicleMaps 测试:3.10 - 3.13 - 所有这些版本的相同问题

MyApp 在 Netbeans 8.2 下运行良好,但如果尝试在命令窗口和命令中运行,总是会出现此异常:

怎么了?

缺少 jar 库 JavacTool ?兼容性?编年史地图中的错误?

感谢您为使用命令运行 myApp 提供的任何输入:

0 投票
1 回答
845 浏览

java - 编年史地图上的迭代非常慢

我看到在编年史地图上迭代的时间非常缓慢——在下面的示例中,在我的 2013 MacbookPro 上,每次迭代超过 100 万个条目需要 93 毫秒。我想知道是否有更好的迭代方法或我做错了什么,或者这是预期的吗?我知道 Chronicle Map 没有针对迭代进行优化,但是几年前的这张票让我期待更快的迭代时间。下面的玩具示例:

输出:完成插入完成启动经过:93327 1000 次迭代