我使用的是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();
}
我要序列化的对象包含项目数组,这些项目本身包含array等,但是完整的图形本身并不那么“大”(这是对数据进行索引的结果,在源头,该数据的大小已经只有1GB左右)。
这也不是由于GC碎片(压缩大堆没有帮助)。
最佳答案
默认情况下,AnyCPU在x86和x64 OS上均作为32位进程运行。因此,即使在x64 OS上设置了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?
关于c# - 带gcAllowVeryLargeObjects的OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23206496/