Clojure:对大型数据结构进行就地更改的惯用方法

Clojure:对大型数据结构进行就地更改的惯用方法,clojure,functional-programming,Clojure,Functional Programming,假设您已经加载了一个大型数据结构(如数据库中的表索引),现在需要进行更改 如果我理解正确,您需要根据当前状态(从磁盘加载的内容)创建一个新状态(包括更改),并将其分配给您拥有的当前标识 在大型数据结构中,这将非常缓慢,因为运行时需要复制一大块内存。是否有可行的替代方案?以下是对Clojure不可变数据结构的几点很好的概述: 正如评论所说,当您进行一个小的更改时,它们不会复制整个数据结构。相反,“旧”和“新”版本为未更改的部分共享数据,使“持久”数据结构非常有效。以下是Clojure的不可

假设您已经加载了一个大型数据结构(如数据库中的表索引),现在需要进行更改

如果我理解正确,您需要根据当前状态(从磁盘加载的内容)创建一个新状态(包括更改),并将其分配给您拥有的当前标识


在大型数据结构中,这将非常缓慢,因为运行时需要复制一大块内存。是否有可行的替代方案?

以下是对Clojure不可变数据结构的几点很好的概述:


正如评论所说,当您进行一个小的更改时,它们不会复制整个数据结构。相反,“旧”和“新”版本为未更改的部分共享数据,使“持久”数据结构非常有效。

以下是Clojure的不可变数据结构的几个良好概述:

正如评论所说,当您进行一个小的更改时,它们不会复制整个数据结构。相反,“旧”和“新”版本共享未更改部分的数据,使得“持久”数据结构相当高效

有没有切实可行的替代方案

如果数据库的选择在您的控制范围内,那么您可以查看一下,它是为使用Clojure的粒度而设计的。据我所知(老实说,不多)

  • 您订阅的数据的差异更新将转发给您;及
  • 数据在客户端进行永久性维护 太:如果你对它保持控制,那永远不会改变,即使 它是什么(用不同的手柄)是不同的
要获得这些特性,请使用


如果我在胡说八道,博学的读者,请让我知道

有没有切实可行的替代方案

如果数据库的选择在您的控制范围内,那么您可以查看一下,它是为使用Clojure的粒度而设计的。据我所知(老实说,不多)

  • 您订阅的数据的差异更新将转发给您;及
  • 数据在客户端进行永久性维护 太:如果你对它保持控制,那永远不会改变,即使 它是什么(用不同的手柄)是不同的
要获得这些特性,请使用



如果我在胡说八道,博学的读者,请让我知道

这并不慢,因为新旧结构共享数据。并不是所有的东西都是复制的。只需使用
update
assoc
。您可以使用瞬态来加快速度。您是指Java数组还是Clojure向量?这是有区别的。如果你使用Clojure,你应该尽可能地使用Clojure数据结构。这个问题还不清楚——对数据结构进行更改的方式取决于结构本身。如果它是可变的,那么你可以简单地对它进行变异;如果它是不可变的,那么你必须创建新的值。如果要应用一系列更改,则可以使用。@mahdix是的,修改向量的成本很低。如果你问的是Java数组,答案和你从Java的角度问的是一样的。您将使用Java的数组方法/订阅来修改它,我希望它的效率与您在Java中所做的一样高。但是,修改数组的性能不应该取决于数组的大小(除非您正在“追加”并需要复制它)。覆盖一个单元格是非常困难的。这并不慢,因为新的和旧的结构共享数据。并不是所有的东西都是复制的。只需使用
update
assoc
。您可以使用瞬态来加快速度。您是指Java数组还是Clojure向量?这是有区别的。如果你使用Clojure,你应该尽可能地使用Clojure数据结构。这个问题还不清楚——对数据结构进行更改的方式取决于结构本身。如果它是可变的,那么你可以简单地对它进行变异;如果它是不可变的,那么你必须创建新的值。如果要应用一系列更改,则可以使用。@mahdix是的,修改向量的成本很低。如果你问的是Java数组,答案和你从Java的角度问的是一样的。您将使用Java的数组方法/订阅来修改它,我希望它的效率与您在Java中所做的一样高。但是,修改数组的性能不应该取决于数组的大小(除非您正在“追加”并需要复制它)。覆盖单元格是O(1)afaik。