2014-11-06 19 views
6

Eccezione memoria di sistema esaurita. Vedo che il flusso di memoria viene svuotato solo se salvato. Disponiamo di set di dati da 1,5 a 2 GB.Emissione grande set di dati EPPlus con memoria esaurita Eccezione

Sto usando EPPlus versione 3.1.3.0

Noi il seguente nel codice.

Noi ciclo attraverso

 --> Create a Package 
     --> each table in the datareader 
      --> Add WorkSheet to the Package 
     --> Dispose Each table. 
    --> Save the Package. 

Ogni Datatable è di dimensioni 300 mg fino a 15 tavoli fuori formano il sistema.

Questo sta causando un problema, ho registrato questo in dettaglio @https://epplus.codeplex.com/workitem/15085

ho ancora voglia di essere in grado di utilizzare EPPlus è molto bello API. ma c'è un modo migliore per liberare un foglio di lavoro una volta aggiunto al pacchetto.

Grazie per l'aiuto.

risposta

7

Sfortunatamente, questo sembra essere un limite importante di EPPlus - puoi trovare altri post su di esso nella loro pagina di codeplex. Ho riscontrato un problema simile durante l'esportazione di serie di dati di grandi dimensioni: tabelle singole con 115+ colonne di larghezza e 60.000 di righe alte. In genere, circa 30 a 35k righe si trovano quando ha esaurito la memoria. Quello che sta succedendo è che ogni cella che viene creata è un oggetto che va bene per un piccolo set di dati, ma nel mio caso sarebbe 115x60K = ~ 7 milioni. Poiché ogni cella è un oggetto con contenuto (principalmente stringhe), l'impronta della memoria si somma rapidamente.

A un certo punto in futuro il mio piano era di creare manualmente i file XML utilizzando Linq2Xml. Un xlsx è solo un file zip rinominato con file XML che costituiscono il contenuto della cartella di lavoro e dei fogli di lavoro. Quindi, puoi creare un xlsx vuoto usando EPP, salvarlo, aprirlo come zip, estrarre sheet1.xml e aggiungere il contenuto dei dati tramite la manipolazione delle stringhe. Dovresti anche lavorare sul file sharedstring.xml che Excel usa per mantenere la dimensione del file verso il basso. Probabilmente ci sono altri file xml che dovranno essere aggiornati anche con chiavi o nome.

Se si rinomina qualsiasi xlx in un'estensione .zip, è possibile visualizzarlo.

Esempio 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> 

Esempio 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> 

si può vedere come ho fatto manipolazione xml nel mio altro post:

Create Pivot Table Filters With EPPLUS

Mi spiace di non averti dato una risposta migliore ma spero che questo aiuti.

0

@Ernie ha ragione su alcuni limiti della versione corrente di EPPlus. L'hanno riconosciuto e hanno lavorato per risolverlo. Questo ti lascia una delle due opzioni possibili per far funzionare tutto questo:

1) Passa alla Beta di EPPlus 4.0, dove hanno risolto questo problema, insieme ad altre cose (anche se userete una versione beta).

2) I ExcelPackage e ExcelWorksheet classi sia implementare IDisposable, così si potrebbe iniziare a ricevere prestazioni migliori se si dovesse avvolgere il vostro uso di loro in un comunicato using().

+2

Qualsiasi documention che è fissato in beta 4? Non ha fatto alcuna differenza per me - garantito questo è stato qualche mese fa. Mi piacerebbe averlo risolto, ma sembrava che richiedesse una revisione completa del motore principale. Uso sempre IDisposable (tramite Using's) e non fa nessuna differenza per me. Il problema è che il pacchetto/cartella di lavoro rimarrà in memoria fino alla chiusura completa. Ho persino provato a esportare in modo incrementale i dati con una serie di open-save-close-reopen-add e non ha fatto alcuna differenza. È una cosa tutto o niente - nel momento in cui apri il file, TUTTO viene caricato. Ancora una volta, mi piacerebbe essere smentito. – Ernie

+0

EPPlus 4.1.0 non lo risolve. E il displosing non aiuta se hai solo 1 foglio di lavoro su cui scrivere. – Heiner

7

Ho avuto questo problema, ma è fissato commutando l'opzione di "Platform target", da x86 a x64 o "Any CPU". (fare clic con il tasto destro sul progetto, quindi selezionare "Proprietà", quindi la scheda "Costruisci", quindi "Destinazione piattaforma" selezionare "x64")

Il problema è che per la piattaforma x86 è possibile utilizzare solo circa 1,8 GB di RAM. Per la piattaforma x64, non si dispone di questa limitazione.

+1

Questo ha funzionato anche per me. Aveva un foglio di calcolo Excel con 210.000 record e stava ottenendo eccezioni out-of-memory. All'inizio ho pensato che fosse perché stavo facendo un sacco di cose in parallelo; la ricompilazione in x64 la risolve. –

0

Prestare attenzione se si stanno passando flussi in ExcelPackage. Nel mio caso ho avuto un servizio Windows, caricando un pacchetto usando un memorystream. Ora il servizio si è interrotto dopo alcune volte con un'eccezione OutOfMemory.

Motivo: lo smaltimento di ExcelPackage non disporrà lo streaming!

Soluzione:

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