2014-11-06 61 views
6

系统内存不足异常。我看到内存流只在保存时刷新。我们有1.5 - 2GB数据集。带有内存不足异常的EPPlus大数据集问题

我使用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是300毫克规模达15个表出来形成系统。

这是造成问题,我已详细@https://epplus.codeplex.com/workitem/15085

我还是希望能够使用EPPlus它非常漂亮的API记录在此。但是有一种更好的方式可以在我们将它添加到包中时释放工作表。

谢谢你的帮助。

回答

7

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

在未来的某个时候,我的计划是使用Linq2Xml手动创建XML文件。一个xlsx只是一个用XML文件重新命名的zip文件,构成了工作簿和工作表的内容。因此,您可以使用EPP创建一个空的xlsx,将其保存,以zip形式打开它,提取sheet1.xml并通过字符串操作添加数据内容。您还必须处理Excel使用的sharedstring.xml文件以帮助保持文件大小。可能还有其他需要更新的xml文件以及键或名称。

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

例sheet1.xml:

Simple Excel File Example

<?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"> 
      <c r="A1" t="s"> 
       <v>0</v> 
      </c><c r="B1" t="s"> 
       <v>1</v> 
      </c><c r="C1" t="s"> 
       <v>0</v> 
      </c> 
     </row> 
     <row r="2" spans="1:3" x14ac:dyDescent="0.25"> 
      <c r="A2" t="s"> 
       <v>1</v> 
      </c><c r="B2" t="s"> 
       <v>0</v> 
      </c><c r="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操作:

Create Pivot Table Filters With EPPLUS

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

0

@Ernie对EPPlus当前版本的一些限制是正确的。他们已经承认这一点,并一直在努力修复它。这给你带来了两种可能的选择之一,让这个工作:

1)切换到EPPlus 4.0测试版,他们已经解决了这个问题,以及一些其他的事情(虽然你会用一个测试版)。

2)ExcelPackageExcelWorksheet类都实现IDisposable,所以如果你要包装你对他们的使用在using()声明中你可能会开始得到更好的性能。

+2

,它被固定在测试4的任何机制的文档?这对我来说没有什么区别 - 这是几个月前的事。希望它能够修复,但它看起来像是需要对核心引擎进行重大改造。我总是使用IDisposable(通过使用),它对我来说没有任何区别。问题是包/工作簿将一直保留在内存中,直到完全关闭。我甚至尝试通过一系列open-save-close-reopen-add逐步导出数据,并没有什么区别。它是一个全部或没有任何东西 - 当你打开文件它将被加载。再次,愿意被证明是错误的。 – Ernie 2014-11-07 15:24:48

+0

EPPlus 4.1.0不能解决它。如果您只有一个工作表可以写入,则displosing无效。 – Heiner 2017-02-23 09:22:44

7

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

问题是,对于平台x86,只能使用约1.8 GB内存。对于平台x64,您没有此限制。

+1

这也适用于我。有一个Excel电子表格,有210,000条记录,并且正在发生内存不足的例外情况。起初,我认为这是因为我并行地做了很多东西;以x64模式重新编译解决了它。 – 2016-01-06 08:25:53

0

如果您将流传递给ExcelPackage,请注意。在我的情况下,我有一个Windows服务,使用内存流加载一个包。现在,服务在出现OutOfMemory异常后崩溃了。

原因:处理ExcelPackage不处理流!

解决方案:

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