2014-11-06 121 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 
}