我有一个可序列化的类(称之为A),实现了ISerializable。
如果我在阵列中序列化大约11K这些(作为阵列),反序列化需要大约1.3GB的最大VM大小才能将大约170MB的磁盘映像读入250MB的最终VM大小。这需要大约5分钟(经过时间),4:20分钟(CPU时间)。
如果我将上述每个11K对象分别序列化到同一个文件(连同计数指示器),反序列化需要大约250MB的最大VM大小才能将略小(160MB)的磁盘映像读入250MB的最终VM尺寸。这需要大约35秒(经过时间),20秒(CPU时间)。
任何想法为什么?似乎很奇怪。上述两种情况都使用二进制序列化。
P.S。如果它是相关的,则在A的实例中有一堆包含的可序列化对象。每个这些序列化对象都是实现ISerializable的类的实例。
答案 0 :(得分:1)
我认为增量序列化过程比complete.array的序列化花费的时间更少,因为这个增量过程创建了短期对象。即,当每个对象序列化完成时,不再引用在序列化过程中创建的那些对象,而我可以想象整个数组的序列化导致许多对象被引用更长时间。 .net垃圾收集器针对生命周期较短的对象进行了优化,其中许多对象大多保存在cpu缓存中,直到a.generation 0集合。
我建议使用内存分析器并找出问题所在。我过去使用过ANTS内存分析器,可以推荐它。
答案 1 :(得分:1)