使用EPPlus Excel库时的大量内存分配

时间:2014-07-03 19:38:04

标签: c# excel epplus

上下文

我一直使用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;

垃圾收集结果,在第二行代码之前和之后。

The ammount of memory in use is too damn high

所以,我不知道从现在开始该做什么。我正在做的就是打开报告,该报告在内存上耗费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之后,我仍然有相同的异常,它在第一行之后抛出,而不是在第二行引发。

2 个答案:

答案 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功能也都提供。