使用gcAllowVeryLargeObjects的OutOfMemoryException

我正在使用BinarySerializer,它有一个非常大的(尽管不是很深)项目图。 我有8GB的ram支持12Gig的交换,并且在序列化时我得到一个OutOfMemoryException,这是预期的(图表可能接近或超过2Gb)。

然而,当我使用gcAllowVeryLargeObjects它并没有更好,我仍然得到相同的exception,我肯定在应该保留在内存中的东西(至少与交换)。

有什么我可以做的来支持序列化这个/一种方法来获得相同的function集但是可能会得到结果吗?

我的序列化代码没有什么特别之处:

public static byte[] Serialize(this object o) { var ms = new MemoryStream(); var bf = new BinaryFormatter(); bf.Serialize(ms, o); ms.Position = 0; return ms.ToArray(); } 

我正在序列化的对象包含自身包含数组等的项目数组,但完整的图形本身不是“那么大”(它是索引数据的结果,在源处,已经只有大约1GB的大小)。

这也不是由于GC碎片造成的(压缩大堆没有帮助)。

默认情况下,AnyCPU在x86和x64 OS上都以32位进程运行。 因此,即使在x64 OS上设置了gcAllowVeryLargeObjects也会遇到4GB的地址空间限制(x86上为2GB)。

要更改取消选中解决方案属性 – >“构建”选项卡上的“首选32位”属性。

详细信息和历史可以在以下答案中找到: Visual Studio 2012中“首选32位”设置的目的是什么?它实际上如何工作?