取 'snapshots' 个大对象

Taking 'snapshots' of big Objects

我面临以下问题。一个线程正在构建和更新树对象。要验证树,需要计算该树的哈希值。因此,第二个线程连续计算该树的哈希值。

现在我遇到了以下问题:该树的大小约为 300mb,我想确保在计算哈希值时树不会发生变化,例如拍摄快照并计算它的哈希值。

我猜我有以下两个选择:

  1. 在计算哈希时阻止写入树。 (不理想,因为计算需要相当长的时间)
  2. 通过复制该对象获得 'snapshot'。然后计算哈希值。 (也不是很好,因为还需要 300mb 的内存)

获取 'snapshots' 大对象而不只是复制它们是否有常见的技巧或模式?

(我的猜测是这对树对象进行了深刻的更改,但我很感谢您提供的每一个提示。)

提前致谢, flxh

PS:我不知道这个问题是否重要,但我正在使用 Java (1.8)

我认为你不应该在计算新哈希时阻塞,也不应该复制或拍摄整棵树的快照,尤其是当树占用大约 300 MB 的内存时。

相反,我会采用另一种方法。我会使用增量哈希函数。我不是这些问题的专家,但目前我知道的最好的是来自 greenrobot common 实用程序库的 Murmur3F。请检查他们的样本。

Murmur3F 允许您多次调用它的 update() 方法。然后你调用 getValue() 来获取实际的哈希值。你可以多次这样做。 所以我不会在每次修改时在单独的线程中重新计算整棵树的哈希值。例如,使用那个 Murmur3F 哈希实现,我会在树的每次更新上使用 update() 方法,在树的 getHash() 上使用 getValue() 方法。