itgenclr007:使用VSTO加载项修复32位Excel中的OutOfMemory

Gui*_*ers 2 .net excel vsto invantive-control

使用Invantive Control(使用Microsoft .NET 4.7的VSTO加载项)的复杂查询从Exact Online检索大约200,000行.这适用于64位版本的Microsoft Excel 2010及更高版本.

在查询结束时强制.NET垃圾回收报告后,正在使用大约250 MB的内存.在此过程中,使用的内存会有所不同,但会看到750 MB内存的峰值.

但是,在32位版本上,用户在下载数据期间通常会收到OutOfMemory异常.即使在重构查询以尽早摆脱未使用的列和行之后,它仍然不适合可用内存.

如何在Excel 32位版本中运行这样复杂的查询?

Gui*_*ers 5

尽管至少从Excel 2007开始就可以使用64位版本的Excel,但主要的安装仍然是32位版本的Microsoft Excel.

大多数加载项开发人员从来没有找到证明支持64位Microsoft Office的商业案例,并且在2010年左右,微软改变了它建议将64位版本的Office用于32位版本.

VSTO加载项的可用内存因发布而异,但随着Excel本身的复杂性不断增加而不断下降.

目前,有1.75 GB的可寻址内存空间,无论是Excel还是.NET CLR,您最多可以使用大约250-300 MB的.NET代码和数据.垃圾收集器在可寻址内存空间中完成了所有工作,但通常这是不够的.

通常使用64位Windows版本(现在的通用版本)并向Windows添加更多物理或虚拟内存,无法提高可用和可寻址内存的数量.这是32位地址空间设计的限制.

从2016年5月发布,Microsoft已在Excel.exe的标头中设置了LARGEADDRESSAWARE位.这允许32位版本的Excel就像旧的32位版本的Oracle和其他版本一样,可以处理超过2 GB的内存.

知识基础进一步的文件是什么版本都提供这种服务.鉴于Excel 2013已停止使用,基本上您应该使用32位的新版Excel 2016来避免OutOfMemory异常.

对于Office365订阅者,建议切换到包含最新版Excel 2016的频道.

虽然对于Excel,这会将可寻址内存空间增加到3 GB,但它将可用于.NET代码和数据的内存量从VSTO增加到250-300 MB到1250-1300 MB.令人惊讶的是,可用内存空间增加了4-5倍.

Invantive Control在帮助 - >诊断窗口中显示可寻址的存储空间.

对于非LARGEADDRESSAWARE版本的Excel,它显示:

2 GB有限Excel

但对于LARGEADDRESSAWARE版本,它显示:

Excel具有3 GB可寻址

在分配超过2 GB的行动中:

分配了超过2 GB的32位Excel