我在asp.net + C#
中使用EPPlus库来创建.xlsx
文件。我的文件可能包含几百万个记录,我每100K记录创建一个ExcelWorksheet
。问题是包含几乎40Mb
个记录的1.5M
xlsx我需要多个Gbs的主内存,之后我得到一个OutOfMemoryException
,问题是:
如何减少占用的内存X Gb for 40M?
: - |或者逐渐保存ExcelPackage
并释放内存,(似乎我不能保存多次,并且在整个包装被丢弃之后)。
如果没有解决方案,任何人都可以为EPPlus引入替代品(几乎所有功能,如样式,工作表等)
答案 0 :(得分:5)
此问题似乎在最新版本的EPPlus(4.0.x)
中得到解决编辑:添加指向EPPlus 4.0.4中改进内存管理的页面的参考链接。
https://epplus.codeplex.com/releases/view/118053#ReviewsAnchor 用户评论4.x版本与3.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任务管理器报告的峰值内存工作集只是711 MB Windows任务管理器显示的非分页池只有75K左右!当然,我不确定这些数字是否能够捕获内存占用的全部影响,但这些都是指示性的。输出的Excel文件大约是59MB(可能是我的专栏比您在原始帖子中提到的示例数据更多。)
注意:我确实得到了一个" OutOfMemoryException"当我试图一次写出7列的450万条记录时!
我的测试是否足够严格?也许不是......但对我来说效果很好。
但是,我想到的一个解决方法是克服早期版本中的大内存需求,即为每100K记录拆分并保存xlsx文件。保存后,开始使用新文件(具有适当的文件名计数器增量)用于下一个100K记录。
在您的操作结束时,您最终会有10个100K记录的文件,总共有100万条记录。
可能看起来有点像黑客,但是,嘿,可能比重写你的代码库以使用其他库(免费或商业)更好。
答案 1 :(得分:4)
多次保存无济于事。如果您尝试在导出过程中保存并关闭文件,那么调用垃圾收集,您将看到,将释放消耗的内存。但是,如果您再次尝试打开该文件,则该进程将消耗相同数量的内存。如果您尝试继续进行导出处理,则会再遇到同样的问题。
AFAIK基于Open XML SDK的所有现代.NET库都在内存中执行处理。 EpPlus也是如此。 唯一的方法是在硬盘上执行处理而不加载到内存中。