2014-07-03 121 views
6

语境巨大的内存分配

我一直在使用EPPLUS作为我的工具使用C#作为该库的客户端语言,使Excel自动生成报表。

问题:

试图写一个非常大的报告(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,占用RAM的1.370.817.264字节。

更新一:

有一个相当新的beta version of EPPlus这是指出,有它的changelog:

New Cell store 
* Less memory consumtion 
* Insert columns (not on the range level) 
* Faster row inserts 

更新的NuGet后,我仍然有相同的例外,那就是后抛出第一行,而不是在第二行提出。

回答

4

现代Excel文件,即Xlsx文件是zip压缩的,并且经常实现压缩降低到10%。我只是用一个类似的工具对我生成的一个1.6MB文件进行解压缩,并发现它解压缩到18.8 MB的数据。

你有一个0.138 GB的文件,使用1.370 GB的内存,几乎是10%。内存中的未压缩表示就是吃掉你的记忆。

如果您好奇,可以使用7-Zip等工具来提取Xlsx文件,或者您可以重命名该文件以.zip结尾并在Windows中浏览。

+0

我刚刚提取了〜138MB的报告(.xlsx),并且它最终在磁盘上有0.99 GB。你能想到任何“便宜”的方式吗? –

+1

@MarcelloGrechiLins您可以使用Streams手动创建XML文档,而不是将其全部内容一次写入内存。在某些情况下,您必须将其全部压缩,您可以使用处理较大文件的库来处理该部分。不幸的是,你会错过Excel的易用性。我想真正的问题是“为什么你有如此庞大的Excel文件”? – mason

+0

@mason我正在做一个巴西“四大”电信公司之一的项目(不能说出它的名字)。这份报告负责显示客户的一部分,正如你所期望的那样,这个客户的数量是巨大的。 –