tea*_*man 3 coldfusion performance cfspreadsheet coldfusion-2016
我们有一个Coldfusion应用程序,它运行一个大型查询(最多100k行),然后以HTML格式显示它.然后,UI提供一个"导出"按钮,使用cfspreadsheet标签和电子表格函数触发将报告写入.xlsx格式的Excel电子表格,特别是用于构建行列值的spreadsheetSetCellValue,以及用于格式化的spreadsheetFormatRow和spreadsheetFormatCell函数.然后使用以下命令将ssObj写入文件:
<cfheader name="Content-Disposition" value="attachment; filename=OES_#sel_rtype#_#Dateformat(now(),"MMM-DD-YYYY")#.xlsx">
<cfcontent type="application/vnd-ms.excel" variable="#ssObj#" reset="true">
Run Code Online (Sandbox Code Playgroud)
其中ssObj是SS对象.我们看到的文件大小约为5-10 Mb.
但是......创建此报告和写入文件的内存使用量会增加大约1GB.复合问题是在java GC导出完成后,内存不会立即释放.当我们有多个用户运行并导出这种类型的报告时,内存不断攀升并达到分配的堆大小,并将服务器的性能降低到服务器关闭的程度.通常需要重新启动才能将其清除.
这是正常/预期的行为还是我们应该如何处理这个问题?导出完成后,是否可以根据需要轻松释放此操作的内存使用情况,以便运行报表的其他人可以轻松访问已释放的报表空间?对于5-10Mb文件,这种类型的内存使用是否与cfspreadsheet函数相同并将对象写出来?
我们已经尝试过暂时删除昂贵的格式化函数,但是对于.xlsx文件的创建和编写,内存使用量仍然很大.我们还尝试使用spreadsheetAddRows方法和cfspreadsheet action ="write"query ="queryname"标记传递查询对象,但这也占用了大量内存.
为什么这些功能如此记忆晦暗?如果没有内存不足问题,生成Excel SS文件的最佳方法是什么?
我应该添加服务器在Windows上的Apache/Tomcat容器中运行,我们正在使用CF2016.
在我上一份工作中,我们遇到过这类问题(CF和记忆).大文件上传消耗内存,大量excel导出消耗内存,它只会发生.随着应用程序用户群的增长,您将会遇到这些内存占用请求为其他用户杀死网站的问题.
从内存设置开始.通过将应用程序的分配倍增或增加三倍,您可以全面提升.此外,请确保您使用的CF版本支持的JDK的最新版本.这也可以产生巨大的差异.
大文件上传会影响发出请求的实例的性能.这意味着在同一个实例上执行正常请求的其他人正在不必要地等待这些资源.我们专门设置了一个实例池来处理文件上传.特定的URL通过负载均衡器路由到这些实例,应用程序对此更加满意.
该应用程序还处理了大量数据,用户不断想要"全部".我们不得不强制搜索结果和某些数据集来减少屏幕上显示的数量.DB对此决定非常满意.数据导出被移动到队列中,因此他们可以在正常页面请求之外制作那些大的excel文件.也许他们立即获得了他们的数据,也许等待一段时间才能获得通知.无论哪种方式,应用程序都表现得更好.