【发布时间】: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