6

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

如果没有解决方案,任何人都可以介绍 EPPlus 的替代方案(具有几乎所有功能,如样式、工作表等)

4

2 回答 2

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= 路线图 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(可能是我的列比您在原始帖子中提到的示例数据更多。)

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

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


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

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

可能看起来有点 hack,但是,嘿,可能比重写代码库以使用其他库(免费或商业)更好。

于 2015-06-30T08:42:25.600 回答
4

多次保存将无济于事。如果您尝试在导出过程中保存并关闭文件,然后调用垃圾回收,您将看到,消耗的内存将被释放。但是,如果您随后尝试再次打开文件,则该进程将消耗相同数量的内存。如果您尝试继续您的出口处理,您将再次陷入同样的​​问题。

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

于 2014-12-23T03:43:57.787 回答