itgenclr007: исправление OutOfMemory в 32-разрядной версии Excel с надстройкой VSTO

Сложный запрос с использованием Invantive Control (надстройка VSTO с Microsoft .NET 4.7) извлекает приблизительно 200 000 строк из Exact Online. Это прекрасно работает в 64-разрядных версиях Microsoft Excel 2010 и новее.

После принудительной сборки мусора.NET в конце запроса сообщается, что используется примерно 250 МБ памяти. Во время процесса используемая память меняется, но видит пики в 750 МБ памяти.

Однако в 32-разрядных версиях пользователи часто получают исключение OutOfMemory во время загрузки данных. Даже после рефакторинга запроса, чтобы как можно раньше избавиться от неиспользуемых столбцов и строк, он все равно не помещается в доступную память.

Как выполнить такой сложный запрос в 32-разрядных версиях Excel?

1 ответ

Несмотря на то, что 64-разрядные версии Excel были доступны, по крайней мере, начиная с Excel 2007, основная часть установок по-прежнему остается 32-разрядной версией Microsoft Excel.

Большинство разработчиков надстроек никогда не находили бизнес-обоснования, оправдывающего поддержку 64-разрядной версии Microsoft Office, и в течение 2010 года Microsoft изменила свои рекомендации по использованию 64-разрядных версий Office на 32-разрядные.

Объем доступной памяти для надстроек VSTO варьируется в зависимости от выпуска, но уменьшается с ростом сложности самого Excel.

В настоящее время, имея 1,75 ГБ адресуемой памяти, загруженной как в Excel, так и в.NET CLR, вы можете использовать максимум 250-300 МБ для вашего кода.NET и данных. Сборщик мусора отлично вписывается в пространство адресуемой памяти, но зачастую этого недостаточно.

Объем доступной и адресуемой памяти, как правило, не улучшается благодаря использованию 64-разрядной версии Windows (в настоящее время распространенной версии) и добавлению дополнительной физической или виртуальной памяти в Windows. Это ограничение дизайна 32-битного адресного пространства.

Начиная с выпусков мая 2016 года, Microsoft установила бит LARGEADDRESSAWARE в заголовке Excel.exe. Это позволяет 32-разрядной версии Excel, как и старым 32-разрядным версиям Oracle и другим, использовать более 2 ГБ памяти.

База знаний далее документирует, какие версии предлагают это средство. Поскольку выпуск Excel 2013 был прекращен, по сути, вам следует использовать новую версию Excel 2016 в 32-разрядной версии, чтобы избежать исключения OutOfMemory.

Для подписчиков Office365 рекомендуется переключиться на канал, который содержит достаточно свежую версию Excel 2016.

Хотя для Excel это увеличивает объем адресуемой памяти до 3 ГБ, объем памяти, доступной для вашего кода.NET и данных в виде VSTO, увеличивается с 250-300 МБ до 1250-1300 МБ. Удивительный фактор увеличения доступной памяти в 4-5 раз.

Invantive Control отображает адресную область памяти в окне "Справка -> Диагностика".

Для не LARGEADDRESSAWARE версий Excel это показывает:

Excel ограничен 2 ГБ

Но для версий LARGEADDRESSAWARE это показывает:

Excel с адресом 3 ГБ

В действии с более чем 2 ГБ выделено:

32-разрядный Excel с выделением более 2 ГБ для.NET

Другие вопросы по тегам