我在asp.net + C#中使用EPPlus库来创建.xlsx文件。我的文件可能包含几百万条记录,而我每10万条记录创建一个ExcelWorksheet。问题是几乎包含40Mb1.5M xlsx记录了我占用的多个Gbs主内存,然后我得到OutOfMemoryException,问题是:
我如何减少内存消耗X Gb for 40M?:-|或逐渐保存ExcelPackage并释放内存,(似乎我不能保存一次以上,并且在整个程序包处理完之后,我不能保存多次)。

如果没有解决方案,那么谁能为EPPlus引入替代方案(具有样式,工作表等几乎所有功能)

最佳答案

在最新版本的EPPlus(4.0.x)中似乎已解决了该问题。

编辑:将引用链接添加到页面,以指向EPPlus 4.0.4中改进的内存管理。

https://epplus.codeplex.com/releases/view/118053#ReviewsAnchor
与3.x版本相比,用户对4.x版本中的内存性能有所改进的评论。

https://epplus.codeplex.com/wikipage?title=Roadmap
版本4.0:新的cellstore可以改善插入,删除性能和内存消耗

此链接说明了如何确保优化加载巨大单元格的数量。

http://epplus.codeplex.com/wikipage?title=FAQ&referringTitle=Documentation
请参阅“我要加载很多数据。要想获得最佳性能,我应该怎么看?”部分。

另外,我今天亲自测试了EPPlus 4.0.4,通过一次性写出150万条记录(包括5个数字行和1个DateTime行),Windows Task Manager报告的峰值内存工作集仅为711 MB。 Windows任务管理器显示的非页面缓冲池只有75K左右!当然,我不确定这些数字是否能充分体现出内存占用的全部影响,但这些只是指示性的。输出的Excel文件约为59MB(可能是我的专栏超出了您在原始帖子中提到的示例数据。)

注意:当我尝试一次写入7列的450万条记录时,我确实得到了“OutOfMemoryException”!

我的测试足够严格吗?也许...虽然对我来说效果很好。

但是,我可以想到的一种克服早期版本中大内存需求的解决方法是为每10万条记录拆分并保存一个xlsx文件。保存后,开始为下一个100K记录使用一个新文件(具有适当的文件名计数器增量)。

在操作结束时,您最终将拥有10个10万条记录的文件,例如总共100万条记录。

可能看起来有点骇人听闻,但嘿,可能要比使用某些其他库(免费或商业版)重写代码库更好。

关于c# - EPPlus多次保存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14979041/

10-10 18:46