[英]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:
<?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操作:
對不起,我無法給你一個更好的答案,但希望這有幫助。
我有這個問題,但我通過切換“ Platform target
”選項,從x86
到x64
或“ Any CPU
”來修復它。 (右鍵單擊項目,然后選擇“屬性”,然后選擇“Build”選項卡,再選擇“Platform target”選擇“x64”)
問題是對於平台x86
您只能使用大約1.8 GB的RAM。 對於平台x64
,您沒有此限制。
@Ernie對於當前EPPlus版本的一些限制是正確的。 他們已經承認這一點,並一直在努力修復它。 這為您提供了兩種可能的選項之一:
1)切換到EPPlus 4.0 Beta,他們已經解決了這個問題以及其他一些問題(盡管你將使用測試版)。
2) ExcelPackage
和ExcelWorksheet
類都實現了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.