Java 采取';快照';大型物体
我面临以下问题。一个线程正在构建和更新树对象。要验证该树,需要计算该树的哈希值。因此,第二个线程连续计算该树的哈希值 现在我遇到了以下问题:这棵树的大小约为300mb,我想确保在计算散列时,树不会发生变化,就像拍摄快照并计算散列一样 我想我有以下两个选择:Java 采取';快照';大型物体,java,oop,hash,concurrency,tree,Java,Oop,Hash,Concurrency,Tree,我面临以下问题。一个线程正在构建和更新树对象。要验证该树,需要计算该树的哈希值。因此,第二个线程连续计算该树的哈希值 现在我遇到了以下问题:这棵树的大小约为300mb,我想确保在计算散列时,树不会发生变化,就像拍摄快照并计算散列一样 我想我有以下两个选择: 在计算哈希时阻止写入树。 (不理想,因为计算需要相当长的时间) 通过复制该对象获取“快照”。然后计算散列。 (也不是很好,因为还需要300 MB的内存) 有没有一种常见的技巧或模式可以用来拍摄大对象的“快照”,而不只是复制它们 (我猜这需要对
PS:我不知道这对这个问题是否重要,但我使用的是Java(1.8)我认为您不应该在计算新哈希时阻塞,也不应该复制或拍摄整个树的快照,特别是当树占用大约300 mb内存时 相反,我会采取另一种方法。我会使用增量散列函数。我不是这些方面的专家,但到目前为止,我所知道的最好的一个是实用程序库的3F。请检查他们的样品
3f
允许您多次调用其update()
方法。然后调用getValue()
以获取实际的哈希值。你可以做很多次。
因此,我不会在每次修改时在单独的线程中重新计算整个树的哈希值。例如,使用3f散列实现,我会对树的每次更新使用
update()
方法,对树的getHash()
使用getValue()
你为什么不让肉馅一直新鲜?在每个操作中以一种廉价的方式递增地计算它。Scala和Clojure具有不变的数据结构。您可以使用不可变树(当您添加或删除节点时,该树返回一个新树,该树引用旧树并共享大部分内存)。这是一个深刻的变化,但您可以使用他们现有的收藏。最好的解决方案是@Magnamag,然后是不可变的数据结构或在计算散列时阻塞写入。@flxh请参阅此问题,了解增量散列定义和论文链接。