【发布时间】:2015-10-15 05:59:13
【问题描述】:
我正在努力优化我们的代码,以便我们可以读取、创建和发送可能非常大(2GB的xml文件强>)。
对于读取和创建,我们使用XmlReader 类。
我们实际上是从其他一些服务中得到一个 XML 字符串。如果我们将 XML 字符串存储在一个字符串变量中,它会占用相同数量的内存。抛开这一点不谈,请提出处理 XML 字符串的最佳方法,以免发生内存溢出异常。
我无法在此处显示代码由于公司政策,但这无关紧要,因为代码已经在工作,但如果是大型 xml 字符串,它会给出:
内存异常
...如前所述。
解释:
我们从服务中获得 2GB Xml。
我们使用流式处理它。
由于我们需要使用 xmlreader 读取该 xml,我们以字符串的形式传递 xml 以创建一个大小几乎相同(2GB)的新 xml
byte[] msg = Buffer.ExtractMessage(messageStart, messageEnd);
string msg1 = Encoding.UTF8.GetString(msg);
CreateNewXMLFileFromTheCurrentXmlString(msg1);
然后我们将新的 xml 发送到其他服务。
【问题讨论】:
-
不要使用变量从服务使用流中获取 xml,这篇 msdn 文章会有所帮助,msdn.microsoft.com/en-us/library/aa528818.aspx。
-
我想这完全取决于您是否打算加载和/或询问生成的XML。如果是这样,您可能会继续使用流或不使用流来获取内存错误。 "Xdocument.Load is not the best approach, reason being Xdocument.Load loads the whole file into memory. According to MSDN memory usage will be proportional to the size of the file. You can use XMLReader (Check here) instead if you are just planning to search the XML doc. Read this documentation on MSDN"
-
@Adil XML 库很可能在解析之前完全消耗流 - 所以这也是 OP 需要调查的事情。
-
如果来自其他服务的结果无法以 SAX 方式处理,则可能需要将其写入磁盘,然后再进行处理。
-
@Adil :是的,我们正在使用流。但是一旦我们对该 XML 执行操作,我们需要将其发送到其他一些服务,所以我们需要以 sting 的形式发送,对吗?