Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 采取';快照';大型物体_Java_Oop_Hash_Concurrency_Tree - Fatal编程技术网

Java 采取';快照';大型物体

Java 采取';快照';大型物体,java,oop,hash,concurrency,tree,Java,Oop,Hash,Concurrency,Tree,我面临以下问题。一个线程正在构建和更新树对象。要验证该树,需要计算该树的哈希值。因此,第二个线程连续计算该树的哈希值 现在我遇到了以下问题:这棵树的大小约为300mb,我想确保在计算散列时,树不会发生变化,就像拍摄快照并计算散列一样 我想我有以下两个选择: 在计算哈希时阻止写入树。 (不理想,因为计算需要相当长的时间) 通过复制该对象获取“快照”。然后计算散列。 (也不是很好,因为还需要300 MB的内存) 有没有一种常见的技巧或模式可以用来拍摄大对象的“快照”,而不只是复制它们 (我猜这需要对

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

现在我遇到了以下问题:这棵树的大小约为300mb,我想确保在计算散列时,树不会发生变化,就像拍摄快照并计算散列一样

我想我有以下两个选择:

  • 在计算哈希时阻止写入树。 (不理想,因为计算需要相当长的时间)
  • 通过复制该对象获取“快照”。然后计算散列。 (也不是很好,因为还需要300 MB的内存)
  • 有没有一种常见的技巧或模式可以用来拍摄大对象的“快照”,而不只是复制它们

    (我猜这需要对树对象进行深刻的更改,但我非常感谢每一个提示。)

    提前感谢,, flxh


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

    我认为您不应该在计算新哈希时阻塞,也不应该复制或拍摄整个树的快照,特别是当树占用大约300 mb内存时

    相反,我会采取另一种方法。我会使用增量散列函数。我不是这些方面的专家,但到目前为止,我所知道的最好的一个是实用程序库的3F。请检查他们的样品

    3f
    允许您多次调用其
    update()
    方法。然后调用
    getValue()
    以获取实际的哈希值。你可以做很多次。
    因此,我不会在每次修改时在单独的线程中重新计算整个树的哈希值。例如,使用3f散列实现,我会对树的每次更新使用
    update()
    方法,对树的
    getHash()
    使用
    getValue()

    你为什么不让肉馅一直新鲜?在每个操作中以一种廉价的方式递增地计算它。Scala和Clojure具有不变的数据结构。您可以使用不可变树(当您添加或删除节点时,该树返回一个新树,该树引用旧树并共享大部分内存)。这是一个深刻的变化,但您可以使用他们现有的收藏。最好的解决方案是@Magnamag,然后是不可变的数据结构或在计算散列时阻塞写入。@flxh请参阅此问题,了解增量散列定义和论文链接。