更改 ChronicleMap 的大小

Changing the size of a ChronicleMap

我在服务器中有一个 ChronicleMap (v2.3.2) 运行,使用以下调用创建:

ChronicleMapBuilder.of(MyKey.class, MyValue.class).entries(20_000_000).createPersistedTo(pathToData);

ChronicleMap 中存储的条目数可能需要改变。因此,我设想在应用程序启动时执行以下操作:

  1. 从磁盘加载现有的ChronicleMap
  2. 从现有 ChronicleMap
  3. 中获取最大条目数
  4. 如果新大小(从配置文件加载)没有不同则完成,否则...
  5. 使用新尺寸
  6. 创建一个新的ChronicleMap
  7. 将旧ChronicleMap的内容复制到新的
  8. 关闭并删除旧的 ChronicleMap

但是,我在 ChronicleMap 公开的接口中看不到任何内容,这可以让我找出创建时传递给 entries 方法的值。我假设 longSize() 只是实际存储的条目数,而不是地图的最大大小。

有没有办法找出这个值?或者也许有更好的方法来进行这种迁移?

如果在应用程序启动时执行这一系列步骤并且新大小(从配置文件加载)发生变化,您实际上将那个数量的新条目插入到映射中,即。 e.在应用程序关闭时,地图大小等于新大小(从配置加载),为什么你不能将地图的 longSize() 与新的预期大小进行比较?

无法检索映射到 entries() 配置的值,因为它甚至不是内部 ChronicleMap 状态的一部分,即。 e.它不存储在私有字段中。

防弹的方法是保留之前的配置文件,当主配置文件更新时,比较其中的大小配置。

没有根本不同和更好的方法来改进 ChronicleMap 的大小。如果您需要改变大小,ChronicleMap 不太适合。所以你需要写一些这样的样板代码。

Chronicle Map 3 可能会超出限制(最大为原始大小的 x1000),但如果大小超过最初配置的 entries() 数量,它的性能会急剧下降。

UPDATE. 同样重要的是要注意,在某些情况下,实际上您可能不需要更改大小,例如。 G。如果值很大(KB 及以上)并且条目数也很大。在这种情况下,您可以从一开始就配置最大可能的 Map 大小,但由于惰性页面分配的 Linux 特性,它不会过度使用内存。