1

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

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

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

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

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

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

4

1 回答 1

2

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

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

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

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

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

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

于 2016-02-02T13:32:40.740 回答