2013-02-20 135 views
5

我正在使用EPPlus库asp.net + C#创建.xlsx文件。我的文件可能包含几百万条记录,并且我将为每100K条记录创建一个ExcelWorksheet。问题是一个40Mb xlsx几乎包含1.5M记录我的主要内存的多个千兆位,然后我得到一个OutOfMemoryException,问题是: 我如何减少内存采取X Gb for 40M?: - |或者逐步保存ExcelPackage并释放内存,(似乎我无法保存多次,之后整个包被丢弃)。EPPlus多次保存

如果没有解决,有谁能够为引入一个EPPlus替代(几乎所有的功能,如样式,工作表和等)

+0

一周后没有答案? – 2013-02-25 07:25:59

+1

这是一个非常普遍的问题。 EPPLus是一个伟大的库,但是当涉及到编写大型文件时,内存消耗是一个巨大的问题:( – SharpCoder 2013-03-26 04:20:31

+0

您是否知道.Net的任何替代方案? – 2013-04-10 09:26:08

回答

4

这个问题似乎在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异常”当我试着写4.5万条记录一列7列!

我的测试严格吗?也许不是......虽然适合我。


然而,一个解决办法,我能想到的,以克服在早期版本的大内存的要求是分裂和保存XLSX文件,每100K记录。保存后,开始使用新文件(使用适当的文件名计数器递增),以用于接下来的100K记录。

在您的操作结束时,您最终会得到10个100K记录的文件,例如总计100万条记录。

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

+0

我在提出问题之前已经使用了这种解决方法,它可以工作,但不是最好的答案。您可以提供确切的链接到已解决的问题或已描述新功能的页面吗? l将您标记为最佳答案 – 2015-07-01 12:48:44

+0

我已将链接添加到我的原始答案中。 – 2015-07-02 11:28:25

+0

感谢您的回答,并将其标记为;) – 2015-07-02 12:20:32

4

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

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

+0

你的回答是合理和正确的,但我不能接受这个答案,因为我的主要问题仍然没有答案,“有没有其他选择?” – 2014-12-27 11:43:45

+0

I为您提供的内容丰富的答案做了积极回应 – 2014-12-27 11:44:09