2013-02-20 6 views
5

Я использую библиотеку EPPlus в asp.net + C# для создания файла .xlsx. Мой файл может содержать несколько миллионов записей, и я создаю один ExcelWorksheet за 100 тыс. Записей. проблема в том, что xlsx, который содержит почти 1.5M записей, я беру несколько Gbs основной памяти, и после этого я получаю OutOfMemoryException, вопрос: Как уменьшить объем памяти X Gb for 40M?: - | или сохранить ExcelPackage постепенно и освободить память, (кажется, что я не могу сэкономить более одного раза и после того, как весь пакет установлен).EPPlus multiple saves

Если нет решения, может кто-нибудь представить альтернативу для EPPlus (почти со всеми функциями, как укладка, рабочие листы и т.д.)

+0

Нет ответа через неделю? –

+1

Это очень распространенная проблема. EPPLus - отличная библиотека, но когда дело доходит до написания больших файлов, потребление памяти - огромная проблема :( – SharpCoder

+0

Знаете ли вы хорошую альтернативу для .Net? –

ответ

4

Эта проблема, кажется, решена в последней версии EPPlus (4.0.x)


EDIT: Добавление ссылок, на страницы, которые указывают на улучшенное управление памятью в EPPlus 4.0.4.

https://epplus.codeplex.com/releases/view/118053#ReviewsAnchor Отзывы пользователей о улучшенной производительности памяти в 4.x версии по сравнению с версией 3.x.

https://epplus.codeplex.com/wikipage?title=Roadmap Версия 4.0: Новый cellstore для улучшения вставки, удаления производительность и потребление памяти

Эта ссылка объясняет, как обеспечить загрузку ОГРОМНОЕ количество ячеек оптимизировано.

http://epplus.codeplex.com/wikipage?title=FAQ&referringTitle=Documentation См. Раздел «У меня есть много данных, которые я хочу загрузить. Что я должен думать, чтобы получить лучшую производительность?»

Кроме того, я лично протестировал EPPlus 4.0.4 сегодня, выписав 1,5 миллиона записей за один раз из 5 числовых строк и 1 строки DateTime, а рабочий набор пиковой памяти, указанный диспетчером задач Windows, был всего 711 MB. Непайковый пул, показанный диспетчером задач Windows, составлял всего 75 тыс. Или около того! Конечно, я не уверен, отражают ли эти цифры полное влияние объема памяти, но они являются показательными. Выходной файл Excel был около 59 МБ (возможно, мои столбцы были больше, чем данные примера, упомянутые вами в вашем исходном сообщении.)

ПРИМЕЧАНИЕ. Я получил «OutOfMemoryException», когда пытался записать 4,5 миллиона записей из 7 столбцов за один раз!

Является ли мой тест достаточно строгим? Возможно, нет ... Хорошо работает для меня.


Однако один обходной путь я мог думать, чтобы преодолеть большие требования к памяти в более ранних версиях, чтобы разбить и сохранить файл XLSX для каждого 100K записей. После сохранения начните использовать новый файл (с соответствующим приращением счетчика имен файлов) для следующих 100K записей.

В конце вашей операции у вас будет 10 файлов из 100 тыс. Записей, например, всего 1 млн записей.

Может показаться немного взломанным, но эй, возможно, лучше, чем переписать свою базу кода, чтобы использовать какую-либо другую библиотеку (бесплатную или коммерческую).

+0

Я использовал это обходное решение, прежде чем задавать вопрос. Он работает, но не лучший ответ. Можете ли вы предоставить точную ссылку на решаемую проблему или страницу, описывающую новую функцию? Тогда я Я отмечаю вас как лучший ответ –

+0

Я добавил ссылки на мой оригинальный ответ .. –

+0

спасибо за ваш ответ, отметили его;) –

4

Multiple позволяет экономить не поможет. Если вы попытаетесь сохранить и закрыть файл в середине процесса экспорта, тогда вызовите сборку мусора, вы увидите, что потребленная память будет освобождена. Но если вы попытаетесь снова открыть файл, тот же объем памяти будет потреблен процессом. И если вы попытаетесь продолжить обработку экспорта, вы снова попадете в ту же проблему.

AFAIK все современные библиотеки .NET на основе Open XML SDK выполняют обработку в памяти. Так и EpPlus. Единственный способ - выполнить обработку на жестком диске без загрузки в память.

+0

Ваш ответ рациональен и правилен, но я не могу принять этот ответ, потому что мой главный вопрос по-прежнему остается без ответа: «Есть ли альтернативы?» –

+0

I сделал upvote для вашего информационного ответа –