簡體   English   中英

具有內存不足異常的EPPlus大數據集問題

[英]EPPlus Large Dataset Issue with Out of Memory 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.

每個數據表的大小為300Mg,最多15個表格。

這導致了一個問題,我已經詳細記錄了這個@ https://epplus.codeplex.com/workitem/15085

我仍然希望能夠使用EPPlus非常好的API。 但是,一旦我們將工作表添加到包中,就有更好的方法來釋放工作表。

謝謝你的幫忙。

不幸的是,這似乎是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:

簡單的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">
            <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操作:

使用EPPLUS創建數據透視表過濾器

對不起,我無法給你一個更好的答案,但希望這有幫助。

我有這個問題,但我通過切換“ Platform target ”選項,從x86x64或“ Any CPU ”來修復它。 (右鍵單擊項目,然后選擇“屬性”,然后選擇“Build”選項卡,再選擇“Platform target”選擇“x64”)

問題是對於平台x86您只能使用大約1.8 GB的RAM。 對於平台x64 ,您沒有此限制。

@Ernie對於當前EPPlus版本的一些限制是正確的。 他們已經承認這一點,並一直在努力修復它。 這為您提供了兩種可能的選項之一:

1)切換到EPPlus 4.0 Beta,他們已經解決了這個問題以及其他一些問題(盡管你將使用測試版)。

2) ExcelPackageExcelWorksheet類都實現了IDisposable ,因此如果要在using()語句中包含它們的using() ,可能會開始獲得更好的性能。

如果要將流傳遞給ExcelPackage,請注意。 在我的情況下,我有一個Windows服務,使用內存流加載包。 現在服務在一些OutOfMemory異常后崩潰了。

原因:處理ExcelPackage不會丟棄流!

解:

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

在調試大量數據時有時會出現此問題。

如果你有Win PRO版本,如果你在真正的IIS中的服務器上嘗試應用程序,或者在tru IIS中使用你的PC

OutOFMemoryException上的問題不會發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM