使用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位”设置的目的是什么?它实际上如何工作?