内存不足exception的EPPlus大型数据集问题

系统内存exception。 我看到的内存stream只保存时刷新。 我们有1.5 – 2GB数据集。

我正在使用EPPlus版本3.1.3.0

我们在代码中执行以下操作。

我们循环

--> Create a Package --> each table in the datareader --> Add WorkSheet to the Package --> Dispose Each table. --> Save the Package. 

每个Datatable是一个300Mg的大小,最多15个表从系统。

这是一个问题,我详细logging了这个@ https://epplus.codeplex.com/workitem/15085

我仍然希望能够使用EPPlus非常好的API。 但是有一个更好的方法来释放一个工作表,一旦我们将其添加到包中。

感谢您的帮助。

不幸的是,这似乎是EPPlus的一个主要限制 – 您可以在其codeplex页面上find其他人张贴的内容。 输出大型数据集时遇到了类似的问题 – 115列宽,60 +行高的单个表。 通常大约30到35k行是内存不足的时候。 发生的事情是每个被创build的单元格都是它自己的对象,对于小数据集来说是好的,但在我的情况下,它将是115×60K =〜700万。 由于每个单元格都是包含内容的对象(主要是string),因此其内存占用加快。

在将来的某个时候,我的计划是使用Linq2Xml手动创buildXML文件。 xlsx只是一个用XML文件重新命名的zip文件,组成工作簿和工作表的内容。 所以,你可以使用EPP创build一个空的xlsx,保存它,以zip的forms打开它,拉出sheet1.xml并通过string操作添加数据内容。 您还必须处理Excel使用的sharedstring.xml文件,以帮助保持文件大小。 有可能还有其他的XML文件,需要更新以及键或名称。

如果您将任何xlxs重命名为.zip扩展名,您可以看到这一点。

示例sheet1.xml:

简单的Excel文件示例

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"> <dimension ref="A1:C2"/> <sheetViews> <sheetView tabSelected="1" workbookViewId="0"> <selection activeCell="C5" sqref="C5"/> </sheetView> </sheetViews> <sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25"/> <sheetData> <row r="1" spans="1:3" x14ac:dyDescent="0.25"> <cr="A1" t="s"> <v>0</v> </c><cr="B1" t="s"> <v>1</v> </c><cr="C1" t="s"> <v>0</v> </c> </row> <row r="2" spans="1:3" x14ac:dyDescent="0.25"> <cr="A2" t="s"> <v>1</v> </c><cr="B2" t="s"> <v>0</v> </c><cr="C2" t="s"> <v>1</v> </c> </row> </sheetData> <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/> </worksheet> 

示例sharedstrings.xml:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="6" uniqueCount="2"> <si> <t>AA</t> </si> <si> <t>BB</t> </si> </sst> 

你可以看到我在我的其他职位做了xml操作:

使用EPPLUS创build数据透视表filter

对不起,我不能给你一个更好的答案,但希望有所帮助。

我有这个问题,但我通过切换“ Platform target ”,从x86x64或“ Any CPU ”的选项来解决它。 (右键单击项目,然后select“属性”,然后select“Build”,然后在“Platform target”上select“x64”)

问题是,对于x86平台,只能使用大约1.8 GB的RAM。 对于平台x64 ,您没有这个限制。

@Ernie对EPPlus当前版本的一些限制是正确的。 他们已经承认,并一直在努力解决这个问题。 这让你有两个可能的select之一,让这个工作:

1)切换到EPPlus 4.0 Beta,他们已经解决了这个问题,以及一些其他的东西(虽然你会使用一个testing版)。

2) ExcelPackageExcelWorksheet类都实现了IDisposable ,所以你可能会开始获得更好的性能,如果你想using()语句来包装你的用法。

请注意,如果您将stream传递给ExcelPackage。 在我的情况下,我有一个Windows服务,使用内存stream加载一个包。 现在服务在OutOfMemoryexception之后崩溃了一段时间。

原因:处理ExcelPackage不处理stream!

解:

 using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(excelSheetBase64))) using (ExcelPackage excelPackage = new ExcelPackage(ms)) { // Your code }