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

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

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

但是,在32位版本中,用户在下载数据时经常会遇到OutOfMemoryexception。 即使在重构查询以尽早摆脱未使用的列和行之后,它仍然不适合可用的内存。

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

尽pipeExcel 2007至less有64位版本的Excel已经可用,但安装的主要内容仍然是32位版本的Microsoft Excel。

大多数插件开发人员从来没有findcertificate支持64位Microsoft Office的业务案例,并且在2010年左右,Microsoft更改了将64位版本的Office用于32位版本的build议。

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

目前,具有1.75 GB的可寻址内存空间,无论是Excel还是加载了.NET CLR,您最多可以使用大约250-300 MB的.NET代码和数据。 垃圾收集器做了很好的工作,将其全部放在可寻址的内存空间中,但这往往是不够的。

通过使用64位Windows版本(现在的普通版本)和向Windows添加更多物理或虚拟内存,通常不会改善可用内存和可寻址内存的数量。 这是32位地址空间devise的限制。

从2016年5月的发行版开始,Microsoft已经在Excel.exe头中设置了LARGEADDRESSAWARE位。 这允许32位版本的Excel就像旧版本的32位版本的Oracle等,以解决超过2 GB的内存。

知识库进一步logging了该设施提供的版本。 鉴于Excel 2013已经停止,本质上你应该使用32位新版本的Excel 2016来避免OutOfMemoryexception。

对于Office365用户,build议切换到包含足够新版Excel 2016的频道。

尽pipe对于Excel来说,这增加了可寻址的内存空间,只有3 GB,它将可用于.NET代码和数据的内存量从250-300 MB增加到1250-1300 MB。 惊人的因素4-5增加了可用内存空间。

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

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

2 GB有限的Excel

但是对于LARGEADDRESSAWARE版本,它显示:

与3 GB寻址Excel

在超过2 GB分配的行动:

分配了超过2 GB的32位Excel