Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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
Javascript Redux+;ImmutableJS-如何对太大的存储进行垃圾收集?_Javascript_Reactjs_Redux_Frontend_Immutable.js - Fatal编程技术网

Javascript Redux+;ImmutableJS-如何对太大的存储进行垃圾收集?

Javascript Redux+;ImmutableJS-如何对太大的存储进行垃圾收集?,javascript,reactjs,redux,frontend,immutable.js,Javascript,Reactjs,Redux,Frontend,Immutable.js,我正在将Redux与ImmutableJS一起使用。在我的SPA(相当复杂的管理系统)中,用户经常将大量数据加载到存储中(对于许多表,有数千行)。在打开几个页面并在应用商店中有太多数据后,应用程序的速度会明显变慢,因为ImmutableJS应用商店甚至可以包含数百万条条目 我怎样才能从商店中“删除”一些东西,这样数据就不会减慢应用程序的速度?我知道这违背了它的主要原则,但你怎么解决呢 使用一个常见的网站,比如jQuery,这将非常简单。每次页面刷新,所有不必要的东西都会被垃圾收集。因此,一个页面

我正在将Redux与ImmutableJS一起使用。在我的SPA(相当复杂的管理系统)中,用户经常将大量数据加载到存储中(对于许多表,有数千行)。在打开几个页面并在应用商店中有太多数据后,应用程序的速度会明显变慢,因为ImmutableJS应用商店甚至可以包含数百万条条目

我怎样才能从商店中“删除”一些东西,这样数据就不会减慢应用程序的速度?我知道这违背了它的主要原则,但你怎么解决呢

使用一个常见的网站,比如jQuery,这将非常简单。每次页面刷新,所有不必要的东西都会被垃圾收集。因此,一个页面上有2-3千个条目是可以的,但是当打开一个新页面时,reducer会加载新的数据,但是旧的数据仍然会被引用


当然,我不想强迫用户重新加载页面。

我建议不要将整个数据保存在存储中,而是将其指针保存到内存解决方案(localstorage、REDIS等)。我只想在我的店里使用和储存
\u rev
版本号。

因为我看到有人推荐我,我想让你试用一下,我们已经在生产中使用了将近一年,没有发现任何性能问题。

三重检查这实际上是内存膨胀,而不仅仅是不必要的重新渲染/重新计算 Redux中的变异状态几乎总是一个真正的问题,因为它是库的一种先决条件。我首先关心的是,要三次检查您是否确实由于内存膨胀而遇到内存问题,而不是由于不必要的重新渲染或不必要的计算。我的意思是,如果您将大量数据保存在同一位置,请确保您没有做一些导致对不必要的重新渲染或筛选过多数据做出反应的事情

您可以通过司法使用库或使用其他类型的备忘录来解决该问题,这些备忘录将以避免不必要的重新计算的方式从您的还原程序中检索数据。同样,确保仅在更改一行时不在整个列表中

去掉对前一个状态的引用

如果您真的需要沿着这条路走下去,那么如果您愿意的话,就不要让旧页面的数据保持“活动”,因为JavaScript只会垃圾收集不再被引用的内容

香草Redux并没有保留以前的状态。它所做的只是将当前状态保持在一个
let
变量中,然后在将操作分派到根减速机中获得新状态后更改其值(请参阅)

所以,我要确保我没有使用像redux开发工具这样的东西

然后在reducer中,创建一个新对象,该对象不以任何方式使用以前的数据,而是返回一个包含新数据的新对象:

const data = (state, action) => {
  switch (action.type) {
    case 'RETRIEVE_DATA_SUCCESS':
      return action.payload;
    default:
      return state
  }
}

我建议阅读Chrome的内存分析工具,以确保其正常工作。

前一篇文章关于Immutablejs保持旧数据“活动”的观点是错误的……从某种意义上说,它是被描述的。Immutablejs使用结构共享,这仅仅意味着它将只创建一个新节点及其子节点,而将剩余的trie与旧数据共享。如果你看下图,你会发现右边的绿色和黄色点是新的数据,与旧数据共享其结构

旧数据部分(右侧的蓝色圆点)可用于垃圾收集,只要你不在应用程序的其他地方保留对它的引用。如果你想在你的应用程序中添加一个时间旅行功能,那么保留一个参考资料是非常有益的

如果您按照惯用的Redux深度克隆每个对象,那么如果没有immutablejs的结构共享,您将面临更大的内存问题。因此,如果没有看到一些代码,我怀疑这里的问题是不可变的

您是否偶然使用了
toJS()
?如果你是,这是一个昂贵的操作,除非绝对必要,否则应该避免。它还会断开不可变实例的连接,您将失去结构共享的所有好处。这是我见过的常见错误。您无需像这样调用
toJS()
就可以访问这些值

const immVal=List([1,2,3])
console.log([…immVal.values()])

结构共享@23:40和垃圾收集@24:50


谢谢。您对谈论将此技术用于Redux的材料有什么建议吗?我主要考虑的是将这些数据放在商店之外的某个地方,但是在clean JS variable中,没有其他数据库,因此我对更多关于优缺点的信息感兴趣。不,我没有具体的信息,但它非常简单,您发出一个动作,比如“SAVE_DATA”,您可以拥有一个小型中间件,它将基于此持久化您的数据。“获取数据”也是如此。对于异步操作,有许多解决方案,如sagas、redux pack等,由于引用的剩余部分,将mine设置为不包含关于删除Immutable.JS的信息。然而,如果我在实践中真的错了,我会感到惊讶,但因为我无法证明这一点,我将其删除。经过一番思考后,我认为OP的主要问题是保留不必要的引用,但这绝不是immutable的错。听起来他们是在向Redux存储添加新页面,而不是只使用新页面的数据重置reducer。如果他们在这些数据上运行过滤器,在加载数百万条条目后,他们会看到速度减慢。