在x86架构下使用32位应用程序,理论上32位能够分配4G的大小空间,但实际上默认 .NET Framework 可以创建一个不超过 2 GB 的对象,在实际使用过程中可能使用到1.5G的样子就会报内存溢出异常。
刚写了一个读取数据在内存中组装xml的程序,有10多万条数据,结果程序运行一段时间后就报内存溢出。而我本机是16GB,内存消耗不到8G,我又不想修改程序。所以我就将程序生成x64,不仅成功处理而且速度提升不少。
目前只要是比较新的vs在程序生成的时候VS默认选择的是32位,所以生成的时候尽管你的PC是64位,但是程序任然以32位运行。
这样生成的程序考虑兼容性,目标平台any cpu ,默认首选32位。
我们只需要将目标平台选择x64即可。
默认情况下,在 64 位 Windows 操作系统上运行 64 位托管应用程序时,可以创建一个不超过 2 GB 的对象。 然而,在 .NET Framework 4.5 中,可以增加该限制。以为CLR也有32位和64位之分,所以 .NET Framework要求4.5
我的程序时4.6.1,然后如果你发现数组这些对象还是不能使用超过2G,那么你可以在config里面将gcAllowVeryLargeObjects
配置添加进去。
<configuration>
<runtime>
<gcAllowVeryLargeObjects enabled="true" />
</runtime>
</configuration>
同时可以通过在VS 2022 中配置生成,生成的时候选择要生成的平台就行了 。了解生成平台
并且目前新的VS 2022本身IDE也是64位,所以了解下而不是都默认选项有时候会事半功倍。
https://devblogs.microsoft.com/visualstudio/visual-studio-2022/
我的xml生成程序如下,我们使用不同位数对比下处理时间。
x86:
x64:
由于数据量大的时候加载内存32位会内存溢出,所以我减少了数据让程序都能运行,只有几万条,但还是可以看出来x64的处理时间要少些。