【问题标题】:OutOfMemoryException with gcAllowVeryLargeObjects带有 gcAllowVeryLargeObjects 的 OutOfMemoryException
【发布时间】:2014-06-06 01:18:57
【问题描述】:

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

【问题讨论】:

  • 我假设您使用的是 64 位操作系统?
  • 您是否有理由在内存中序列化这么大的东西而不是文件?如果我看对了,那么在单个执行点上,您的内存需求至少是结构(结构本身、它的 MemoryStream 内容和来自 MemoryStream 的字节数组)大小的 3 倍。你可以序列化到文件吗?
  • @AlexeiLevenkov AnyCPU 在 64 位操作系统上(所以应该是 64 位,除非我没理解?)
  • 不,它将是 x86,除非您取消选中“首选 32 位”。
  • B/w,你在MemoryStream 周围缺少using,这可能会导致你的记忆问题(尽管不是这里的核心问题)。

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


【解决方案1】:

默认情况下,AnyCPU 在 x86 和 x64 操作系统上作为 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?

【讨论】:

    猜你喜欢
    • 2013-01-28
    • 2011-04-19
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    相关资源
    最近更新 更多