上下文
我一直使用EPPLUS作为自动生成Excel报告的工具,使用C#作为库的客户端语言。
问题:
在尝试编写一个非常大的报告(SQL查询的响应),使用数据透视表,图表等之后,我最终得到了Out of Memory Exception
。
疑难解答
为了排除故障,我决定打开一个138MB的现有报告,并使用GC
对象试着看看我的记忆发生了什么,这里是结果
ExcelPackage pkg = new ExcelPackage (new FileInfo (@"PATH TO THE REPORT.xlsx"));
ExcelWorkbook wb = pkg.Workbook;
垃圾收集结果,在第二行代码之前和之后。
所以,我不知道从现在开始该做什么。我正在做的就是打开报告,该报告在内存上耗费10倍(实际上是9.98倍)报告大小本身。
excel文件的~138MB,占用了1.370.817.264字节的RAM。
更新一次:
最新的beta version of EPPlus已经出现在其变更日志上:
New Cell store
* Less memory consumtion
* Insert columns (not on the range level)
* Faster row inserts
在更新Nuget之后,我仍然有相同的异常,它在第一行之后抛出,而不是在第二行引发。
答案 0 :(得分:4)
现代Excel文件,即Xlsx文件是压缩压缩的,并且通常可以实现低至10%的压缩。我刚刚解压缩了我使用类似工具生成的1.6MB文件,发现它被提取到18.8 MB的数据。
你有一个0.138 GB的文件使用1.370 GB的内存,几乎就是10%。记忆中未压缩的表现就是吃掉你的记忆。
如果您感到好奇,可以使用7-Zip等工具提取Xlsx文件,也可以将文件重命名为.zip并在Windows中浏览。
答案 1 :(得分:0)
由于我也遇到过这种情况,也没有找到真正的解决方案,所以我不得不自己提出解决方案。 它是一个新的库:https://github.com/danielgindi/SpreadsheetStreams.net
这是基于我的一段非常老的代码,该代码支持csv和xml,重构接口,添加xlsx支持并作为独立库发布。
这不是 代替EPPlus或其他电子表格处理库,而这只是关于流生成报告。并非所有的excel功能也都提供。