Проблема большого набора данных EPPlus с отсутствием памяти

Исключение системы из памяти. Я вижу, что память Stream только очищается при сохранении. У нас есть 1.5 – 2GB Datasets.

Я использую EPPlus версии 3.1.3.0

В коде мы делаем следующее.

Мы проходим через

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

Каждый Datatable имеет размер 300Mg до 15 таблиц из системы.

Это вызывает проблему, я записал это подробно @ https://epplus.codeplex.com/workitem/15085

Я все еще хочу иметь возможность использовать EPPlus очень красивый API. но есть ли лучший способ освободить рабочий лист, как только мы добавим его в пакет.

Спасибо за помощь.

К сожалению, это, по-видимому, является основным ограничением EPPlus – вы можете найти другие сообщения об этом на странице Codeplex. Я столкнулся с аналогичной проблемой при экспорте большого набора данных – одиночных таблиц с 115 + столбцами в ширину и 60K + строк. Обычно около 30-35 тыс. Строк – это когда у него заканчивается память. То, что происходит, это каждая созданная ячейка – это собственный объект, который подходит для небольшого набора данных, но в моем случае это будет 115x60K = ~ 7 миллионов. Поскольку каждая ячейка представляет собой объект с контентом (в основном строки), его объем памяти складывается быстро.

В какой-то момент в будущем я планировал создавать XML-файлы вручную с помощью Linq2Xml. Xlsx – это просто zip-файл, переименованный в файлы XML, составляющий содержание рабочей книги и рабочих листов. Таким образом, вы можете создать пустой xlsx, используя EPP, сохранить его, открыть его как zip, вытащить sheet1.xml и добавить содержимое данных с помощью строковых манипуляций. Вам также придется работать с файлом sharedstring.xml, который использует Excel, чтобы уменьшить размер файла. Возможно, есть и другие файлы xml, которые нуждаются в обновлении, а также с ключами или именем.

Если вы переименуете любой xlxs в расширение .zip, вы можете это увидеть.

Пример sheet1.xml:

Простой пример файла Excel

             0  1  0     1  0  1      

Пример sharedstrings.xml:

    AA   BB   

Вы можете видеть, как я делал манипуляции с xml в другом сообщении:

Создание фильтров таблицы поворота с помощью EPPLUS

Извините, я не мог дать вам лучший ответ, но, надеюсь, это поможет.

У меня была эта проблема, но я исправил ее, переключив опцию « Platform target », от x86 до x64 или « Any CPU ». (щелкните правой кнопкой мыши по проекту, затем выберите «Свойства», затем вкладку «Построить», затем в «objective платформы» выберите «x64»)

Проблема в том, что для платформы x86 вы можете использовать только около 1,8 ГБ ОЗУ. Для платформы x64 вас нет этого ограничения.

@Ernie правильно относится к некоторым ограничениям текущей версии EPPlus. Они признали это и работали над его исправлением. Это оставляет вам один из двух возможных вариантов:

1) Перейдите на бета-версию EPPlus 4.0, где они исправили эту проблему, а также некоторые другие вещи (хотя вы будете использовать бета-версию).

2) В ExcelPackage и ExcelWorksheet реализовано IDisposable , поэтому вы можете начать получать более высокую производительность, если бы вы использовали их для using() в операторе using() .

Обратите внимание, если вы передаете streamи в ExcelPackage. В моем случае у меня была служба windows, загрузив Пакеты с помощью memystream. Теперь служба несколько раз сработала с исключением OutOfMemory.

Причина: утилита ExcelPackage не уничтожает stream!

Решение:

 using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(excelSheetBase64))) using (ExcelPackage excelPackage = new ExcelPackage(ms)) { // Your code } 
  • Снять защиту VBProject с кода VB
  • Как добавить пользовательскую вкладку Ribbon с помощью VBA?
  • Excel: невероятное сокращение и расширение элементов управления
  • VBA эквивалентно функции модема Excel
  • Закрытие приложения Excel с помощью VBA
  • Interesting Posts

    Каков самый быстрый способ запуска приложения в Windows 8?

    Фильтры Django – или?

    Как читать из файла или stdin в Bash?

    Получить индикатор числовой позиции на значках на панели задач?

    Как включить gdb довольно печатать для объектов STL STL в Eclipse CDT?

    Могу ли я контролировать локальный домен домена unix, например, tcpdump?

    Событие ComboBox – SelectionChanged имеет старое значение, а не новое значение

    Как я могу усреднить самые низкие 3 из 6 последних чисел в строке 22? Некоторые ячейки могут быть пустыми

    Сделать муравей тихий без флага -q?

    Нажатие свойств GUI только для чтения обратно в ViewModel

    Android: как заголовок центра в ToolBar

    Как я могу запускать однострочные приложения несколько раз на одном компьютере без VMWare?

    Тестирование Android AsyncTask с помощью Android Test Framework

    Совместное использование предварительно скомпилированных заголовков между проектами в Visual Studio

    Как избежать доступа к изменяемой переменной из закрытия

    Давайте будем гением компьютера.