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 это показывает:
Но для версий LARGEADDRESSAWARE это показывает:
В действии с более чем 2 ГБ выделено: