代码之家  ›  专栏  ›  技术社区  ›  Steve

如何减少内存消耗?

  •  0
  • Steve  · 技术社区  · 16 年前

    这是一个C问题。我在某个时候有一个很大的东西在记忆中。我想把它序列化为一个文件。这有两个步骤。首先,我需要将对象更改为csv字符串。第二,我需要序列化csv字符串。

    我有一个实用工具,可以将字符串附加到memorystream。我使用这个实用工具将大对象转换为csv字符串(在一个大的内存流主干中)。在将大对象转换为memoryStream之后,我创建了memoryStream的streamReader,并调用其方法streamReader.readToEnd()将memoryStream转换为(长)字符串。然后我调用info.addvalue(“bigobject”,string);来序列化该字符串。

    正如人们所看到的,在记忆中,我将实际持有这个大物体的三份拷贝。第一个是对象本身,第二个是memoryStream,保存着csv字符串,第三个是字符串,实际上是memoryStream的冗余部分。

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

    欢迎有任何想法。谢谢您。

    5 回复  |  直到 16 年前
        1
  •  1
  •   Steven Sudit    16 年前

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

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

        2
  •  1
  •   Ty.    16 年前

    尝试以下操作。

            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。

        3
  •  0
  •   jpoh    16 年前

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

        4
  •  0
  •   Booji Boy    16 年前

    我们在谈论什么样的数据?如果是文本数据,那么您可以在内存压缩中使用,这样可以节省大量内存。

        5
  •  0
  •   Jacob    16 年前

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