在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的處理時間要少些。