14

我正在使用带有相当大(虽然不是很深)的项目图的 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 碎片(压缩大堆没有帮助)。

4

1 回答 1

18

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

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

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

于 2014-04-21T22:00:53.383 回答