Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EPPlus大型数据集问题,内存不足异常_C#_Excel_Excel 2007_Epplus - Fatal编程技术网

C# EPPlus大型数据集问题,内存不足异常

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

系统内存不足异常。我看到只有在保存时才会刷新内存流。我们有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.
每个数据表的大小为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模式下重新编译解决了此问题。