Chronicle Map v3.9.0 回归不同尺寸

Chronicle Map v3.9.0 returning different sizes

我正在使用 Chronicle Map v3.9.0,其中有两个进程,进程 A 写入 ChronicleMap,进程 B 仅使用 A 使用的相同持久文件进行初始化。加载后,我在进程 A 和进程 B 中打印 Map.size 但我得到不同的地图大小。我希望两种尺寸相同。在什么情况下,我可以看到这种行为?

我该如何解决这个问题?是否需要任何类型的刷新操作?

一件事,我尝试做的是使用 getAll 方法转储文件,但它会将所有内容作为 json 转储到单个文件中,这几乎杀死了我拥有的任何编辑器。我尝试在进程 B 中使用 MapEntryOperations 来查看是否有任何有趣的事情发生,但似乎它主要是在将某些内容写入地图时调用,而不是在直接从持久存储初始化 Map 时调用。

这看起来很奇怪。 Chronicle Map 中的大小不存储在单个内存位置。 ChronicleMap.size() 遍历并对每个段的大小求和。所以大小是 "weakly consistent",如果一个进程不断地写入 Map,来自多个 threads/processes 的 size() 调用可能 return 略有不同的值。但是,如果没有人写入地图(例如,在您的情况下,刚刚加载后,当进程 A 尚未开始写入时)所有调用者应该看到相同的值。

而不是 getAll() 并手动分析输出,您可以尝试 "count" 通过类似

的条目
int entries = 0;
for (K k : map.keySet()) {
    entries++;
}

我使用的是 createOrRecoverPersistedTo 而不是 createPersistedTo 方法。因此,我的其他进程没有看到完整的数据。

如教程中 Recovery 部分所述:

.recoverPersistedTo() needs to access the Chronicle Map exclusively. If a concurrent process is accessing the Chronicle Map while another process is attempting to perform recovery, result of operations on the accessing process side, and results of recovery are unspecified. The data could be corrupted further. You must ensure no other process is accessing the Chronicle Map store when calling for .recoverPersistedTo() on this store."