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.
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.
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? –
@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
@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. –