拍摄快照'大对象

时间:2015-02-17 20:25:39

标签: java oop hash concurrency tree

我面临以下问题。 One Thread正在构建和更新Tree Object。要验证树,需要计算该树的哈希值。所以第二个Thread会连续计算该树的哈希值。

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

我的猜测是我有以下两种选择:

  1. 在计算哈希值时阻止写入树。 (不理想,因为计算需要相当长的时间)
  2. 通过复制该对象拍摄“快照”。然后计算哈希值。 (也不是很好,因为需要另外300mb的内存)
  3. 是否有一个共同的技巧或模式来拍摄大对象的'快照'而不仅仅是复制它们?

    (我的猜测是这会对树对象进行有意义的更改,但我很感激每一个提示。)

    提前致谢, flxh

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

1 个答案:

答案 0 :(得分:1)

我认为你既不应该在计算新哈希时阻塞,也不应该复制或拍摄整棵树的快照,特别是如果树需要大约300 MB的内存。

相反,我采取了另一种方法。我使用增量散列函数。我不是这些问题的专家,但到目前为止我所知道的最好的是来自greenrobot common实用程序库的Murmur3F。请检查他们的样品。

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