EPPlus多次保存

本文关键字:保存 EPPlus | 更新日期: 2023-09-27 18:00:24

我正在使用asp.net + C#中的EPPlus库来创建.xlsx文件。我的文件可能包含几百万条记录,而我正在为每100K条记录创建一个ExcelWorksheet。问题是,一个几乎包含1.5M40Mb xlsx记录了我占用的多GB主内存,之后我得到了一个OutOfMemoryException,问题是:如何减少占用的内存X Gb for 40M?:-|,或者逐渐保存ExcelPackage并释放内存,(似乎在整个包被释放后,我不能保存一次以上)。

如果没有解决方案,有人能为EPPlus(几乎具有所有功能,如样式、工作表等)引入一种替代方案吗?

EPPlus多次保存

这个问题似乎在最新版本的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=Roadmap4.0版:新增cellstore,可提高插入、删除性能和内存消耗

此链接说明如何确保优化装载大量细胞。

http://epplus.codeplex.com/wikipage?title=FAQ&referringTitle=文档请参阅"我有很多数据要加载。我应该怎么想才能获得最佳性能?"

此外,我今天亲自测试了EPPlus 4.0.4,一口气写出了150万条记录,其中包括5个数字行和1个DateTime行,Windows任务管理器报告的峰值内存工作集仅为711MB。Windows任务管理器显示的非分页池只有75K左右!当然,我不确定这些数字是否反映了内存占用的全部影响,但这些都是指示性的。输出的Excel文件大约是59MB(可能是我的列比你在原始文章中提到的样本数据还多。)

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

我的测试够严格吗?也许不是。。。不过对我来说效果不错。


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

在你的操作结束时,你最终会有10个文件,其中有10万条记录,比如说总共有100万条记录。

可能看起来有点像黑客,但嘿,这可能比必须重写代码库以使用其他库(免费或商业)要好。

多次保存没有帮助如果您试图在导出过程中保存并关闭文件,然后调用垃圾回收,您会看到,已消耗的内存将被释放。但是,如果您尝试再次打开该文件,那么该进程将消耗相同数量的内存。如果你试图继续你的出口加工,你会再次陷入同样的问题。

AFAIK所有基于Open XML SDK的现代.NET库都在内存中执行处理。EpPlus也是如此唯一的方法是在硬盘上执行处理,而不加载到内存中