2014-07-03 9 views
6

KontekstOgromne alokacji pamięci podczas korzystania EPPlus Excel Biblioteka

Używam EPPLUS jak moje narzędzie do automatyzacji generowanie raportów Excel przy użyciu C# jako język klienta biblioteki.

Problem:

Po wypróbowaniu napisać raport naprawdę duże (odpowiedź na zapytanie SQL), z tabel przestawnych, wykresów i tak dalej, i kończy się o Out of Memory Exception.

Rozwiązywanie problemów

Aby rozwiązać problem, postanowiłem otworzyć istniejący raport, który zawiera 138MB i użyć obiektu GC spróbować rzucić okiem na to, co się dzieje z moją pamięcią, a oto wyniki .

ExcelPackage pkg = new ExcelPackage (new FileInfo (@"PATH TO THE REPORT.xlsx")); 
ExcelWorkbook wb = pkg.Workbook; 

Wyniki usuwania śmieci przed drugą linią kodu i po.

The ammount of memory in use is too damn high

Tak, nie mam pojęcia, co robić od teraz. Wszystko, co robię, to otwarcie raportu, który pochłania 10 razy (9,98) razy rozmiar samego raportu, w pamięci.

~ 138 MB pliku Excela, zajmuje 1.370.817.264 bajty pamięci RAM.

Aktualizacja One:

Jest dość niedawno beta version of EPPlus to, że ma na to changelog:

New Cell store 
* Less memory consumtion 
* Insert columns (not on the range level) 
* Faster row inserts 

Po zaktualizowaniu Nuget, nadal mam ten sam wyjątek, który jest wyrzucany po pierwszą linię, zamiast podnosić w drugiej linii.

Odpowiedz

4

Nowoczesne pliki Excel, tj. Pliki Xlsx są skompresowane zip i często osiągają kompresję do 10%. Właśnie zdekompresowałem wygenerowany plik o wielkości 1,6 MB za pomocą podobnego narzędzia i odkryłem, że został wyodrębniony do 18,8 MB danych.

Masz plik 0.138 GB, który korzysta z 1.370 GB pamięci, czyli prawie dokładnie 10%. Nieskompresowana reprezentacja w pamięci to jedzenie twojej pamięci.

Jeśli jesteś ciekawy, możesz użyć narzędzia takiego jak 7-Zip, aby wyodrębnić pliki Xlsx, lub możesz zmienić nazwę pliku, aby zakończyć. Zip i przeglądać go w systemie Windows.

+0

Właśnie wyodrębniłem raport ~ 138 MB (.xlsx) i skończyło się na tym, że miał 0,99 GB na dysku. Czy możesz wymyślić jakikolwiek "tańszy" sposób na zrobienie tego? –

+1

@MarcelloGrechiLins Można ręcznie tworzyć dokumenty XML za pomocą strumieni, zamiast mieć całą zawartość w pamięci na raz. W pewnym momencie będziesz musiał skompresować wszystko, możesz użyć biblioteki, która obsługuje większe pliki, aby obsłużyć tę część. Niestety, stracisz łatwość obsługi programu Excel. Domyślam się, że prawdziwym problemem jest "dlaczego masz tak masywne dokumenty Excela" ?! – mason

+0

@mason Robię projekt dla jednej z firm "Big Four" w Brazylii (nie mogę podać nazwy tej firmy). Ten raport jest odpowiedzialny za wyświetlenie podzbioru jego klientów, który zgodnie z oczekiwaniami jest ogromny. –

Powiązane problemy