【发布时间】:2013-08-16 15:44:20
【问题描述】:
好吧,明确一点,我知道所有 LOH 的事情和进入 LOH 的大对象(超过 85k)和大列表(超过 40k 元素)。
所以我的问题是,在使用 XMLSerialiser 序列化时我需要知道 List 的大小(我不关心它在 RAM 中占用的空间或类似的东西,我只是想要序列化时的大小)但是如果我尝试序列化一个包含大元素的大列表,我会得到 OutOfMemoryException(我知道为什么)
我想知道的是:是否可以将列表 逐个元素序列化并在循环中累积它的大小,例如: //这将是伪代码
long byteLength = 0;
using(stream)
{
foreach(element in MyList)
{
MemoryStream.Serialise(element);
byteLength += MemoryStream.Length;
MemoryStream.Clear();
}
}
有什么建议吗?
更新: @xanatos 的解决方案做我想做的事情,因为它不会在 ram 中添加一个将存储在 LOH 中的大字节 []
正如@Hans Passant 所说,我为什么要做这种处理的目的似乎很重要,所以:我想知道以 XML 序列化的列表的字节大小,以便能够将列表拆分为多个文件根据其总字节在磁盘上。
【问题讨论】:
-
是的,但似乎即使我在流中序列化对象,长度和位置似乎也没有好的值......我累积了
MemoryStream.Length并正在重置 @ 987654323@ 到 0 与Seek(0,0)函数 -
你必须非常绝望才能编写这样的代码,当然有更好的方法。从几个对象开始,通过乘以列表的计数来获得估计值。很不清楚您真正要解决什么问题,大型序列化数据非常适合磁盘而不是内存。
-
我认为我的问题很清楚,上下文不清楚,因为没有必要。我的问题:我想序列化一个 List
而不在我的 LOH 中序列化它的所有字节。 @xanatos 提交的解决方案修复了它,因为它不会创建一个大的 byte[],而只是得到它的Length
标签: c# serialization stream out-of-memory