2014-11-06 17 views
6

Wyjątek systemowy poza pamięcią. Widzę pamięć Strumień jest płukany tylko po zapisaniu. Mamy 1,5 - 2 GB zestawów danych.Duży problem z zestawem danych EPPlus z wyjątkiem braku pamięci

Używam EPPlus wersja 3.1.3.0

Mamy następujące w kodzie.

Mamy pętli

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

Każdy DataTable ma wielkość 300 mg do 15 Stoliki na zewnątrz tworzą układ.

to jest przyczyną problemu, mam zalogowany to szczegółowo @https://epplus.codeplex.com/workitem/15085

nadal chcę, aby móc korzystać z EPPlus jej bardzo ładny API. ale czy istnieje lepszy sposób na zwolnienie arkusza roboczego po dodaniu go do pakietu.

Dziękuję za pomoc.

Odpowiedz

7

Niestety, wydaje się to być głównym ograniczeniem EPPlus - można znaleźć inne informacje na ten temat na swojej stronie kodowej. Podczas eksportu dużego zestawu danych napotkałem podobny problem - pojedyncze tabele o szerokości 115+ i wysokości 60K + wiersze. Zazwyczaj około 30 do 35 tys. Wierszy występuje, gdy zabrakło im pamięci. To, co się dzieje, to każda stworzona komórka, która jest właściwa dla małego zbioru danych, ale w moim przypadku byłaby to 115x60K = ~ 7 milionów. Ponieważ każda komórka jest obiektem z zawartością (głównie ciągi), jej ślad pamięci szybko się powiększa.

W pewnym momencie w przyszłości mój plan polegał na ręcznym utworzeniu plików XML przy użyciu Linq2Xml. Xlsx to po prostu plik zip, którego nazwa została zmieniona na pliki XML tworzące zawartość skoroszytu i arkuszy kalkulacyjnych. Więc możesz stworzyć puste xlsx używając EPP, zapisz go, otwórz jako zip, wyciągnij sheet1.xml i dodaj zawartość danych poprzez manipulację ciągami. Trzeba również pracować nad plikiem sharedstring.xml, którego używa Excel, aby zmniejszyć rozmiar pliku. Prawdopodobnie istnieją inne pliki xml, które będą wymagały aktualizacji wraz z kluczami lub nazwą.

Jeśli zmienisz nazwę dowolnego xlxs na rozszerzenie .zip, zobaczysz to.

Przykład 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> 

Przykład 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> 

Można zobaczyć, jak to zrobiłem manipulacji xml w mój drugi wpis:

Create Pivot Table Filters With EPPLUS

Niestety, nie mogłem dać ci lepszej odpowiedzi, ale mam nadzieję, że to pomoże.

0

@Enie ma rację co do niektórych ograniczeń obecnej wersji EPPlus. Uznali to i pracowali nad naprawieniem tego. To daje ci jedną z dwóch możliwych opcji, aby to zadziałało:

1) Przejdź do EPPlus 4.0 Beta, w którym naprawiono ten problem, a także kilka innych rzeczy (chociaż będziesz używać wersja beta).

2) ExcelPackage i ExcelWorksheet zajęcia zarówno wdrożenia IDisposable, więc można zacząć uzyskiwać lepsze wyniki jeśli było owinąć wykorzystanie ich w using() oświadczeniu.

+2

Wszelkie dokumentację, że jest ona ustalana w fazie beta 4? Dla mnie to nie miało znaczenia - przyznał, że było to kilka miesięcy temu. Chciałbym to naprawić, ale wyglądało na to, że wymaga on gruntownego remontu głównego silnika. Zawsze używam IDisposable (przez Using's) i nie ma dla mnie znaczenia. Problem polega na tym, że pakiet/skoroszyt pozostaną w pamięci do całkowitego zamknięcia. Próbowałem nawet stopniowo eksportować dane przez serię open-save-close-reopen-add i nie robiło to żadnej różnicy. Jest to wszystko lub nic - od momentu otwarcia pliku ALL zostaje załadowany. Znowu chciałbym, aby udowodniono, że jest źle. – Ernie

+0

EPPlus 4.1.0 go nie rozwiąże. A przesuwanie nie pomaga, jeśli masz do napisania tylko 1 arkusz roboczy. – Heiner

7

miałem ten problem, ale naprawiłem ją przełączeniem opcję „Platform target”, z x86 do x64 lub „Any CPU”. (kliknij prawym przyciskiem myszy na projekcie, następnie wybierz "Właściwości", następnie kartę "Zbuduj", a następnie "Cel platformy" wybierz "x64")

Problem polega na tym, że na platformę x86 można użyć tylko około 1,8 GB BARAN. W przypadku platformy x64 nie masz tego ograniczenia.

+1

To działało również dla mnie. Miał arkusz kalkulacyjny Excela z 210 000 rekordami i wychodził z wyjątków pamięci. Początkowo myślałem, że to dlatego, że robiłem wiele rzeczy równolegle; rekompilacja w trybie x64 rozwiązała problem. –

0

Zwróć uwagę, jeśli przekazujesz strumienie do pakietu ExcelPackage. W moim przypadku miałem usługę Windows, ładując pakiety używając memorystream. Teraz usługa uległa awarii po pewnym czasie z wyjątkiem OutOfMemory.

Powód: Zrzut pakietu ExcelPackage nie pozbawia strumienia!

Rozwiązanie:

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