我正在使用Chronicle Map的v3.9.0,其中我有两个进程,其中进程A写入ChronicleMap,进程B只使用A使用的相同持久文件进行初始化。加载后,我在进程A和进程B中打印Map.size,但我得到不同的Map大小。我期待两种尺寸都一样。在什么情况下,我能看到这种行为吗?
如何解决此问题?是否需要进行任何冲洗操作?
有一件事,我尝试做的是使用getAll方法转储文件,但它将所有内容作为json转储到单个文件上,这几乎杀死了我所拥有的任何编辑器。我尝试在进程B中使用MapEntryOperations来查看是否有任何有趣的事情,但似乎主要是在将某些内容写入地图时调用,而不是直接从持久性存储中初始化Map时。
答案 0 :(得分:2)
我使用createOrRecoverPersistedTo
代替createPersistedTo
方法。因此,我的其他流程没有看到整个数据。
如教程中的Recovery部分所述:
.recoverPersistedTo()需要专门访问Chronicle Map。如果并发进程正在访问Chronicle Map,而另一个进程正在尝试执行恢复,则访问进程端的操作结果和恢复结果未指定。数据可能会进一步损坏。在此商店调用.recoverPersistedTo()时,您必须确保没有其他进程访问Chronicle Map存储。"
答案 1 :(得分:0)
这看起来很奇怪。 Chronicle Map中的大小不存储在单个内存位置。 ChronicleMap.size()
遍历并总结每个细分受众群的大小。因此大小“弱一致”,如果一个进程不断写入Map,来自多个线程/进程的size()
调用可能会返回稍微不同的值。但是如果没有人写入地图(例如在你加载的情况下,当进程A尚未开始写入时),所有调用者应该看到相同的值。
而不是getAll()
并手动分析输出,您可以尝试通过类似
int entries = 0;
for (K k : map.keySet()) {
entries++;
}