取 'snapshots' 个大对象
Taking 'snapshots' of big Objects
我面临以下问题。一个线程正在构建和更新树对象。要验证树,需要计算该树的哈希值。因此,第二个线程连续计算该树的哈希值。
现在我遇到了以下问题:该树的大小约为 300mb,我想确保在计算哈希值时树不会发生变化,例如拍摄快照并计算它的哈希值。
我猜我有以下两个选择:
- 在计算哈希时阻止写入树。
(不理想,因为计算需要相当长的时间)
- 通过复制该对象获得 'snapshot'。然后计算哈希值。
(也不是很好,因为还需要 300mb 的内存)
获取 'snapshots' 大对象而不只是复制它们是否有常见的技巧或模式?
(我的猜测是这对树对象进行了深刻的更改,但我很感谢您提供的每一个提示。)
提前致谢,
flxh
PS:我不知道这个问题是否重要,但我正在使用 Java (1.8)
我认为你不应该在计算新哈希时阻塞,也不应该复制或拍摄整棵树的快照,尤其是当树占用大约 300 MB 的内存时。
相反,我会采用另一种方法。我会使用增量哈希函数。我不是这些问题的专家,但目前我知道的最好的是来自 greenrobot common 实用程序库的 Murmur3F。请检查他们的样本。
Murmur3F
允许您多次调用它的 update()
方法。然后你调用 getValue()
来获取实际的哈希值。你可以多次这样做。
所以我不会在每次修改时在单独的线程中重新计算整棵树的哈希值。例如,使用那个 Murmur3F 哈希实现,我会在树的每次更新上使用 update()
方法,在树的 getHash()
上使用 getValue()
方法。
我面临以下问题。一个线程正在构建和更新树对象。要验证树,需要计算该树的哈希值。因此,第二个线程连续计算该树的哈希值。
现在我遇到了以下问题:该树的大小约为 300mb,我想确保在计算哈希值时树不会发生变化,例如拍摄快照并计算它的哈希值。
我猜我有以下两个选择:
- 在计算哈希时阻止写入树。 (不理想,因为计算需要相当长的时间)
- 通过复制该对象获得 'snapshot'。然后计算哈希值。 (也不是很好,因为还需要 300mb 的内存)
获取 'snapshots' 大对象而不只是复制它们是否有常见的技巧或模式?
(我的猜测是这对树对象进行了深刻的更改,但我很感谢您提供的每一个提示。)
提前致谢, flxh
PS:我不知道这个问题是否重要,但我正在使用 Java (1.8)
我认为你不应该在计算新哈希时阻塞,也不应该复制或拍摄整棵树的快照,尤其是当树占用大约 300 MB 的内存时。
相反,我会采用另一种方法。我会使用增量哈希函数。我不是这些问题的专家,但目前我知道的最好的是来自 greenrobot common 实用程序库的 Murmur3F。请检查他们的样本。
Murmur3F
允许您多次调用它的 update()
方法。然后你调用 getValue()
来获取实际的哈希值。你可以多次这样做。
所以我不会在每次修改时在单独的线程中重新计算整棵树的哈希值。例如,使用那个 Murmur3F 哈希实现,我会在树的每次更新上使用 update()
方法,在树的 getHash()
上使用 getValue()
方法。