1

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

如何解决此问题?是否需要任何类型的冲洗操作?

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

4

2 回答 2

2

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

如教程中的恢复部分所述,详细说明:

.recoverPersistedTo() 需要独占访问 Chronicle Map。如果一个并发进程正在访问 Chronicle Map,而另一个进程正在尝试执行恢复,则访问进程侧的操作结果和恢复结果是未指定的。数据可能会进一步损坏。在此存储上调用 .recoverPersistedTo() 时,您必须确保没有其他进程正在访问 Chronicle Map 存储。”

于 2016-07-27T13:39:14.010 回答
0

这似乎很奇怪。Chronicle Map 中的大小不存储在单个内存位置。ChronicleMap.size()遍历并总结每个段的大小。所以大小是“弱一致的”,如果一个进程不断地写入一个 Map,size()来自多个线程/进程的调用可能会返回稍微不同的值。但是,如果没有人写入地图(例如,在您的情况下,在加载之后,当进程 A 尚未开始写入时)所有调用者都应该看到相同的值。

getAll()您可以尝试通过类似的方式“计数”条目,而不是手动分析输出

int entries = 0;
for (K k : map.keySet()) {
    entries++;
}
于 2016-07-07T09:38:31.480 回答