如何减少内存消耗?

时间:2009-07-10 03:54:47

标签: c# .net memory-management

这是一个C#问题。我在某个时间在记忆中有一个大物体。我想将它序列化为一个文件。有两个步骤可以做到这一点。 1,我需要将对象更改为csv字符串。 2,我需要序列化csv字符串。

我有一个实用工具,可以将字符串附加到MemoryStream。我使用这个实用工具将大对象转换为csv字符串(在MemoryStream的一个大树干中)。在将大对象转换为MemoryStream之后,我创建了MemoryStream的StreamReader并调用其方法StreamReader.ReadToEnd()将MemoryStream转换为(长)字符串。然后我调用info.AddValue(“BigObject”,string);序列化字符串。

可以看出,在记忆中,我实际上会拥有三个大对象的副本。第一个是对象本身,第二个是MemoryStream,持有csv字符串,第三个是字符串,实际上是MemoryStream的冗余。

有没有办法减少此过程中的内存消耗?看来如果不是MemoryStream,我无论如何都需要使用StringBuilder来保存大对象的csv字符串,无论如何我都需要调用StringBuilder.ToString()来获取最终的字符串。然后最后的字符串和StringBuilder将在内存中共存,并消耗与当前MemoryStream和字符串相同的内存量。

欢迎任何想法。谢谢。

5 个答案:

答案 0 :(得分:1)

如果您担心峰值内存使用量,我想您可以在完成orignal对象后手动强制执行垃圾回收,然后在完成内存流后再次强制执行垃圾回收。

(我要指出的是,虽然有一些案例需要控制垃圾收集,但这通常是一个坏主意。通常情况下,最好让事情在适当的时候收集。)

答案 1 :(得分:1)

尝试以下内容。

        public void SerializeToFile<T>(T target, string filename)
        {
            XmlSerializer serializer = new XmlSerializer(typeof (T));

            using (FileStream stream = new FileStream(filename, FileMode.Create, FileAccess.Write))
            {
                serializer.Serialize(stream, target);
            }
        }

编辑:假设你可以让你的对象实现ISerializable并将你的实用程序绑定到GetObjectData方法。

Edit2:错过了CSV部分。恶心。在序列化后,尝试在XML上使用XSLT。

链接到article关于通过xslt将xml转换为csv。

答案 2 :(得分:0)

您不必实现自己的序列化。您可以将它留给.NET框架。可以找到一个很好的起点here

答案 3 :(得分:0)

我们在谈论什么样的数据?如果它是文本数据,那么你可以使用memery压缩并以这种方式节省大量内存。

答案 4 :(得分:0)

您可能希望在序列化时将对象写入文件,而不是将对象转换为CSV字符串的中间步骤。在构建CSV时,只需使用文件流代替MemoryStream。更好的是,在对象上创建一个SerializeToStream方法,该方法将任何类型的流作为参数。