找回密码
 立即注册

QQ登录

只需一步,快速开始

Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-8-23 14:08:30
11#
您好:

这个我们调研了一下,不是BUG,原因是这样的,内存暴涨不会下降是因为在公式计算中,计算引擎的设计上公式结构树,计算链,计算监视器等步骤,而上面三个步骤会占用内存,占用的内存知道公式结构树销毁的时候才会释放(因为公式会跟着引用参数的变化实时计算,不可能只计算一次)。而按照您说的那样重现demo中公式一共设置了368800个,因为公式本身就很多,所以解析出来的数据占用很大内存也是合理的,内部不下降的原因就是上面所说的。这个可以说已经达到了目前前端的瓶颈了。咱们是在做压力测试还是?
回复 使用道具 举报
dlcnc-zmj
初级会员   /  发表于:2019-8-23 15:06:10
12#
ClarkPan 发表于 2019-8-23 14:08
您好:

这个我们调研了一下,不是BUG,原因是这样的,内存暴涨不会下降是因为在公式计算中,计算引擎的 ...

你好,我们这边不是在做压力测试,是业务上实际可能有这种需求,我们把这个需求放大了一些。
我这边也调查了一下,我发现这个内存暴涨还有一个原因,就是说sumifs()那个公式里的合计范围内存在着带计算式的单元格,我们实际业务有这种需求。我这边测试了一下,把它替换成固定值的单元格以后,内存能到2g,程序不会中断。
请问一下,有什么好的办法能让这个sumifs()单元格等范围内单元格有计算结果以后再计算吗?
  1. var dataArray = [];
  2. var dataObj = [1, 2, 3];
  3. for (var index = 0; index<=15; index++) {
  4.    dataArray.push(dataObj);
  5. }
  6. sheet.setArray(0, 0, dataArray);
复制代码


然后将sumifs()的公式改为:
  1. =SUMIFS(a1:a15, b1:b15, 2, c1:C15, 3)
复制代码
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-8-23 16:50:52
13#
那也是一样的啊,因为公式的结构树这些还是不变的,您之所以内存下降了是因为您是hard code的定制,所以树到了这里就不会在往下走了。而如果是里面嵌套的公式,那么结构树到这里还需要解析下一层节点,最后生成的两棵树明显后者大于前者。而且公式计算本来就是按照先后顺序进行计算的。
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 立即注册
返回顶部