带有gcAllowVeryLargeObjects的OutOfMemoryException

时间:2014-04-21 21:39:48

标签: c# .net out-of-memory .net-4.5 gcallowverylargeobjects

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

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

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

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

    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碎片造成的(压缩大堆没有帮助)。

1 个答案:

答案 0 :(得分:18)

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

更改取消选中"更喜欢32位"溶液性质的性质 - > "建立"标签

详细信息和历史记录可在以下答案中找到:What is the purpose of the "Prefer 32-bit" setting in Visual Studio 2012 and how does it actually work?