gpt4 book ai didi

performance - CFSpreadSheet 函数占用大数据集的内存

转载 作者:行者123 更新时间:2023-12-04 03:13:10 26 4
gpt4 key购买 nike

我们有一个 Coldfusion 应用程序,它正在运行一个大型查询(最多 10 万行),然后以 HTML 格式显示它。然后 UI 提供一个导出按钮,触发使用 cfspreadsheet 标签和电子表格函数将报告写入 .xlsx 格式的 Excel 电子表格,特别是用于构建行列值的电子表格SetCellValue、用于格式化的电子表格格式行和电子表格格式单元格函数。然后使用以下命令将 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">

其中 ssObj 是 SS 对象。我们看到文件大小约为 5-10 Mb。

但是……创建此报告和写入文件的内存使用量增加了大约 1GB。复合问题是java GC导出完成后不会立即释放内存。当我们有多个用户运行并导出这种类型的报告时,内存会不断攀升并达到分配的堆大小,并且会降低服务器的性能,导致服务器瘫痪。通常需要重新启动才能将其清除。

这是正常/预期的行为还是我们应该如何处理这个问题?导出完成后是否可以轻松地按需释放此操作的内存使用量,以便其他运行报告的人可以轻松访问为他们的报告释放的空间? 5-10Mb 文件的这种类型的内存使用是否与 cfspreadsheet 函数和写出对象很常见?

我们已尝试暂时删除昂贵的格式化功能,但创建和写入 .xlsx 文件的内存使用量仍然很大。我们还尝试使用电子表格AddRows 方法和传入查询对象的cfspreadsheet action="write"query="queryname"标记,但这也占用了大量内存。

为什么这些函数如此占用内存?在没有内存不足问题的情况下生成 Excel SS 文件的最佳方法是什么?

我应该添加服务器在 Windows 上的 Apache/Tomcat 容器中运行,我们使用的是 CF2016。

最佳答案

  • 您为 CF 实例分配了多少内存?
  • 您正在运行多少个实例?
  • 为什么你允许任何人在 HTML 中查看 10 万条记录?
  • 你为什么允许任何人即时导出这么多数据?

  • 在我的上一份工作中,我们遇到了此类问题(CF 和内存)。大文件上传消耗内存,大excel导出消耗内存,这就是会发生的。随着您的应用程序用户群的增长,您将达到一个点,这些内存占用请求会杀死其他用户的站点。

    从您的内存设置开始。通过将应用程序分配的数量增加一倍或三倍,您可能会全面提升。此外,请确保您使用的是适用于您的 CF 版本的受支持 JDK 的最新版本。这也可以产生巨大的差异。

    大文件上传会影响发出请求的实例的性能。这意味着同一实例上执行正常请求的其他人正在不必要地等待这些资源。我们将一个实例池专门用于处理文件上传。通过负载均衡器将特定 URL 路由到这些实例,应用程序对此感到高兴得多。

    该应用程序还处理了大量的数据,用户一直想要“全部”。我们不得不强制搜索结果和某些数据集来减少屏幕上显示的数量。 DB 对这个决定非常满意。数据导出被移到一个队列中,这样他们就可以在正常页面请求之外制作那些大的 excel 文件。也许他们立即得到了他们的数据,也许等待了一段时间才能得到通知。无论哪种方式,该应用程序的整体性能都更好。

    关于performance - CFSpreadSheet 函数占用大数据集的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52653672/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com