C# EPPlus大型数据集问题,内存不足异常
系统内存不足异常。我看到只有在保存时才会刷新内存流。我们有1.5-2GB的数据集 我使用的是EPPlus版本3.1.3.0 我们在代码中执行以下操作 我们循环通过C# EPPlus大型数据集问题,内存不足异常,c#,excel,excel-2007,epplus,C#,Excel,Excel 2007,Epplus,系统内存不足异常。我看到只有在保存时才会刷新内存流。我们有1.5-2GB的数据集 我使用的是EPPlus版本3.1.3.0 我们在代码中执行以下操作 我们循环通过 --> Create a Package --> each table in the datareader --> Add WorkSheet to the Package --> Dispose Each table. --&g
--> Create a Package
--> each table in the datareader
--> Add WorkSheet to the Package
--> Dispose Each table.
--> Save the Package.
每个数据表的大小为300Mg,系统中最多有15个数据表
这导致了一个问题,我已经详细记录了这个@
我仍然希望能够使用EPPlus及其非常好的API。但是,一旦我们将工作表添加到包中,有没有更好的方法来释放它呢
感谢您的帮助。不幸的是,这似乎是EPPlus的一个主要局限性-您可以在他们的codeplex页面上找到其他关于它的帖子。在导出大型数据集时,我遇到了类似的问题—单表有115+列宽,60K+行高。当内存耗尽时,通常大约有30到35k行。所发生的事情是,创建的每个单元格都是它自己的对象,这对于小数据集来说很好,但在我的例子中,它将是115x60K=~700万。因为每个单元格都是一个包含内容(主要是字符串)的对象,所以它的内存占用很快就会增加 在将来的某个时候,我的计划是使用Linq2Xml手动创建XML文件。xlsx只是一个zip文件,用构成工作簿和工作表内容的XML文件重命名。因此,您可以使用EPP创建一个空的xlsx,保存它,将其作为zip打开,拉出sheet1.xml并通过字符串操作添加数据内容。您还必须处理sharedstring.xml文件,Excel使用该文件来帮助减小文件大小。可能还有其他xml文件需要使用密钥或名称进行更新 如果您将任何XLX重命名为.zip扩展名,您可以看到这一点 示例sheet1.xml:
<?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>
0
1.
0
1.
0
1.
示例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>
AA
BB
您可以在我的另一篇文章中看到我是如何处理xml的:
很抱歉,我不能给你一个更好的答案,但希望这能有所帮助。@Ernie对当前版本的EPPlus的一些限制是正确的。他们已经承认了这一点,并一直在努力解决这一问题。这样,您就可以从两个可能的选项中选择一个来实现此功能: 1) 切换到EPPlus 4.0测试版,在那里他们已经解决了这个问题,还有其他一些问题(尽管您将使用测试版)
2)
ExcelPackage
和ExcelWorksheet
类都实现了IDisposable
,因此,如果将它们的用法封装在using()
语句中,您可能会开始获得更好的性能。我遇到了这个问题,但我通过切换“平台目标
选项来修复它,从x86
到x64
或“任何CPU
”。(右键单击项目,然后选择“属性”,然后单击选项卡“构建”,然后在“平台目标”上选择“x64”)
问题在于,对于平台
x86
,您只能使用大约1.8GB的RAM。对于平台x64
,您没有此限制 如果要将流传递到ExcelPackage,请注意。在我的例子中,我有一个windows服务,使用memorystream加载一个包。现在,该服务在一段时间后崩溃,出现OutOfMemory异常
原因:处理ExcelPackage不会处理流
解决方案:
using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(excelSheetBase64)))
using (ExcelPackage excelPackage = new ExcelPackage(ms))
{
// Your code
}
在调试大量数据时,有时会出现此问题 如果您在服务器中以true
IIS
如果您有Win-PRO
版本,也可以在tru IIS中的PC中使用
OutOFMemoryException
上的问题没有出现。是否有任何文档说明它在beta 4中已修复?这对我来说没什么区别——就算这是几个月前的事了。我很想把它修好,但它看起来需要对核心引擎进行大修。我总是使用IDisposable(通过使用),这对我来说没有什么区别。问题是在完全关闭之前,软件包/工作簿将保留在内存中。我甚至尝试通过一系列的open-save-close-reopen-add增量导出数据,但没有任何效果。这是一个要么全有,要么全无的问题——打开文件的那一刻,它就被加载了。同样,我希望被证明是错误的。EPPlus 4.1.0并不能解决这个问题。如果你只有一张工作表要写,那么替换也没用。这对我也很有用。有一个包含210000条记录的Excel电子表格,并且内存不足。一开始我以为这是因为我在做很多并行的事情;在x64模式下重新编译解决了此问题。