我正在使用asp.net + C#中的EPPlus库来创建.xlsx文件。我的文件可能包含几百万条记录,并且我每100K条记录创建一个ExcelWorksheet。问题是,一个包含几乎1.5M记录的40Mb xlsx可能会占用多Gbs的主内存,之后我会得到一个OutOfMemoryException,问题是:我如何才能减少占用X Gb for 40M?:-|的内存,或者逐渐地保存ExcelPackage并释放内存,(似乎我不能保存多次,在整个包被释放之后)。
如果没有解决方案,有没有人可以介绍一种EPPlus的替代方案(几乎所有的功能,如样式、工作表等)
发布于 2015-06-30 16:42:26
这个问题似乎在最新版本的EPPlus (4.0.x)中得到了解决。
编辑:添加指向EPPlus 4.0.4中改进的内存管理的页面的引用链接。
用户对4.x版与3.x版相比内存性能有所提高的https://epplus.codeplex.com/releases/view/118053#ReviewsAnchor 评论。
https://epplus.codeplex.com/wikipage?title=Roadmap 4.0版:新的cellstore改进了插入、删除性能和内存消耗
这个链接解释了如何确保加载大量的单元格是优化的。
http://epplus.codeplex.com/wikipage?title=FAQ&referringTitle=Documentation Refer部分“我有很多数据要加载。我应该考虑什么才能获得最佳性能?”
另外,我今天亲自测试了Windows4.0.4,一次写出了150万条记录,包括5个数字行和1个DateTime行,而Windows Task Manager报告的峰值内存工作集只有711MB。Windows任务管理器显示的非分页池只有75K左右!当然,我不确定这些数字是否反映了内存占用的全部影响,但这些只是指示性的。输出的Excel文件大小约为59MB (可能是我的列数超过了您在原始帖子中提到的示例数据)。
注意:当我试图一次写7列的450万条记录时,我得到了一个"OutOfMemoryException“!
我的测试够严格了吗?不过,也许not...Works对我来说很好。
但是,为了克服早期版本中的大内存需求,我能想到的一种解决方法是为每100K条记录拆分并保存一个xlsx文件。保存后,开始对下一个100K记录使用新文件(具有适当的文件名计数器增量)。
在操作结束时,您最终将拥有10个100K记录的文件,假设总共有100万条记录。
这看起来可能有点麻烦,但是嘿,可能比不得不重写你的代码库来使用其他库(免费的或商业的)要好。
发布于 2014-12-23 11:43:58
如果您在导出过程中尝试保存并关闭文件,然后调用垃圾收集,您将看到,消耗的内存将被释放。但是,如果您随后将尝试再次打开该文件,则该进程将消耗相同数量的内存。如果你试图继续你的出口加工,你会再次陷入同样的问题。
AFAIK所有基于Open XML SDK的现代.NET库都在内存中执行处理。EpPlus也是如此。唯一的方法是在硬盘上执行处理,而不加载到内存中。
https://stackoverflow.com/questions/14979041
复制相似问题