找回密码
 立即注册

QQ登录

只需一步,快速开始

ch.yang

注册会员

2

主题

8

帖子

126

积分

注册会员

积分
126
最新发帖
ch.yang
注册会员   /  发表于:2019-11-12 16:32  /   查看:8783  /  回复:11
6金币
本帖最后由 ch.yang 于 2019-11-12 18:41 编辑

我在使用spreadjs 产品时遇到一个性能问题。我使用excelio去导出一个Excel文件时,出现了内存不足的情况。
用于导出Excel的ssjson大约120M左右,我能提供的内存是3个G,导出时直接内存爆掉了。。

我的运行环境是用Nodejs jsdom加载html,在后台导出Excel。因为业务原因,我只能放在后台导出Excel(后来我也尝试过前台导出,IE11直接挂。。这不行,客户要求IE11。。。)

我想问的是:
1.有没有什么办法可以节省些内存,导出时间长一点也可以接受,但内存不能超过3个G。
2.ssjson的优化方面,我已经把我用到的style都做成namedStyle了,style方面尽可能做小了。还有其他的可以优化减小ssjson size的办法吗?我的ssjson就是数据多。

我的ssjson太大了,没法上传。。
但里面的内容是有8个sheet,每个sheet有200列,1800行。每个单元格的数据都是999,999,999。

另外,我做了一些测试。测试环境win10 1903 16G内存 浏览器都是最新版的。
IE11在导出Excel文件时,直接崩溃,画面重新打开。。
Edge在导出Excel时,所用内存直接飙到4G多。卡了一会后,终于下载下来了。
Chrome在导出时,所用内存570M左右,等了一下就出来了。
Nodejs 环境下,利用jsdom,导出Excel时,用了2G多的内存,但是有时也会飙到3G多。
Chrome和Nodejs用的不都是V8引擎嘛,为什么差距这么大呢?

我购买的spreadjs 版本是12.2.4。
Nodejs 10.15

08-1.zip

1.39 MB, 阅读权限: 150, 下载次数: 134

最佳答案

查看完整内容

经电话沟通,原因是namestyle的循环设置太多导致性能变慢,建议namestyle做一个去重处理,同样的样式设置为一个namestyle,您试一下电话沟通的解决方案,有什么问题咱们在这个帖子继续沟通

11 个回复

倒序浏览
最佳答案
最佳答案
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-11-12 16:32:06
来自 10#
经电话沟通,原因是namestyle的循环设置太多导致性能变慢,建议namestyle做一个去重处理,同样的样式设置为一个namestyle,您试一下电话沟通的解决方案,有什么问题咱们在这个帖子继续沟通
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-11-12 17:41:24
2#
本帖最后由 ClarkPan 于 2019-11-13 09:02 编辑

导出这里跟很多有关,浏览器内核,ssjson文件的内容,机器的性能均有关系。这里其他都不是我们能够管控的地方,我们只能从ssjson文件内容着手去进行优化。您要是方便的话提供一下您的ssjson文件给我们,我们就具体问题去进行调研。
另外如果是真的是到达了前端的性能瓶颈,这里推荐在服务器端进行导出Excel,这里就不用SpreadJS做导出了, 我们有另一款专门做服务器端Excel操作的组件叫GCExcel,用它在服务器端进行导出Excel,前端显示用SpreadJS与之进行结合
https://demo.grapecity.com.cn/spread/gcexceljava/#/
他有java和.net两个版本,可以直接兼容SpreadJS生成的ssjson,这里前后端通过ssjson进行交互,是一套完整的前后端解决方案
回复 使用道具 举报
ch.yang
注册会员   /  发表于:2019-11-12 18:36:01
3#
本帖最后由 ch.yang 于 2019-11-12 18:42 编辑
ClarkPan 发表于 2019-11-12 17:41
导出这里跟很多有关,浏览器内核,ssjson文件的内容,机器的性能均有关系。这里其他都不是我们能够管控的地 ...

感谢回复。
我把ssjson传上去了,麻烦给看看。
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-11-13 09:35:18
4#
收到,我看一下給您回复
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-11-13 17:11:33
5#
本帖最后由 ClarkPan 于 2019-11-13 17:43 编辑

这个ssjson是如何生成的,为什么里面每一个单元格用的都是不同的buildinstyle
回复 使用道具 举报
ch.yang
注册会员   /  发表于:2019-11-13 22:11:16
6#
本帖最后由 ch.yang 于 2019-11-13 22:46 编辑
ClarkPan 发表于 2019-11-13 17:11
这个ssjson是如何生成的,为什么里面每一个单元格用的都是不同的buildinstyle

>这个ssjson是如何生成的
我的最终目的是,以Spread designer做成的ssjson为模板,用程序生成用于绑定到模板的数据,将数据绑定到模板(ssjson)spread.setDatasource(),最后利用spread.toJson()保存成ssjson,再将这个ssjson导出成Excel。
我上传的附件就是保存成Excel前的ssjson。不过在上传附件之前,我用Spread designer打开了,将一些表头信息删除了。我想这个操作不会影响ssjson吧。

>为什么里面每一个单元格用的都是不同的buildinstyle
我用于生成ssjson的模板文件是利用Spread designer做成的。而我的模板是有原型Excel文件的(原型文件是xls的),所以我先用Excel转成了xlsx文件,再用Spread designer导入后,修改而来的。而每一个cell都有不同的buildinstyle,我认为就是这么来的,就是因为我用Excel导入的。
我的模板比较多,不可能一个一个人工重画。

我来详细描述一下整个流程,以便你分析一下,我这么用Spreadjs是否合理。或者你可以提一些建议。
你可以理解为我做的系统是一个生成一堆各种各样报表的系统。
第一步,我要生成的这些报表都是有Excel原型文件的,不过都是.xls的文件。然后利用Excel2016将xls文件另存为xlsx文件,再将这些文件用Spread designer读入,删除原有的数据并对需要显示数据的cell设定bindpath,对于有循环数据的模板,只保留一行用于设定数据和样式拷贝(就像我上传的模板一样)。至此,模板做完了,保存到服务器的一个位置。
第二步,做成绑定数据。
第三步,读入模板,读入绑定数据,将数据绑定到模板上。然后再用excelio.save导出成Excel文件。
对于那些固定行数固定列数的模板,性能没有问题。问题出在需要循环绑定数据的模板上。做成绑定好数据的ssjson都没有问题,但是excelio.save是会有内存不足的情况发生。(不是每次都内存不足,跟服务器的状态和报表数据量有关,比如显示数据都是999999999时,基本都出不来。)

对于出现性能问题的部分(需要循环绑定数据的模板)我的最终目的是:每一行数据要求动态绑定,并且每一行的style都一样。
我现在的实现方式是:在模板中仅保留需要循环的行,循环设定数据和style。
针对出现的性能问题,我的优化过程如下:

最初的时候,我利用sheet.copyTo()方法来拷贝需要循环的行,再把数据设定到拷贝的行上,但是测试的时候发现,这样做内存消耗极大。
经调查后发现,我的每一个cell都有一个style,用copyTo之后这些style也被复制了一份,ssjson巨大。。

所以,我做出了调整,在spread.fromJson之前,我先将ssjson读入到内存中,修改ssjson的内容,
找到我要循环的行,将这行的每一个cell的样式都取个名字并追加到namedStyle中,再把这一行的每一个cell的style都换成namedstyle中的样式。
我自定义style的命名规则是【ns_列index】比如,ns_0就是循环行,第一列的样式。做完这些操作后,再用spread.fromJson读入。
在设定数据时,不再使用copyTo,而是直接用sheet.setArray设定数据,然后,对每一列设定style,比如第二列的样式就设置为ns_1,第三列设置为ns_2,以此类推。
这次优化后,确实好了不少,大多数文件都能做出来了,但是有极个别的偶尔还是会有内存不足的情况发生。就比如附件的这种情况。
我也知道可以继续优化style,可以把所有样式都读出来然后去重,得到一个极致的namedStyle。但是,我觉得还可能有内存不足的情况发生。并且我手动改ssjson,可能对spreadjs的内部处理造成影响,从而引出一些未知的bug。

写的比较多,还麻烦给分析下,希望能够在满足我的需求的前提下,提供减少内存使用的方法,谢谢了~


回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-11-14 09:50:49
7#
如果可以的话,咱们电话具体沟通一下,可以私信发给我您的电话
回复 使用道具 举报
ch.yang
注册会员   /  发表于:2019-11-14 10:16:55
8#
ClarkPan 发表于 2019-11-14 09:50
如果可以的话,咱们电话具体沟通一下,可以私信发给我您的电话

我没有权限回复短消息。。但是我能看到你给我发的内容。
你可以用短消息发给我一个邮箱地址,我再把手机号发到你的邮箱。你看这样可以吗?

回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-11-14 13:39:56
9#
好的,已经发了
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部