OutOfMemoryException加载xml文档winmo 6.1

时间:2010-09-23 20:15:25

标签: c# .net xml windows-mobile compact-framework

我在Windows Mobile 6.1设备上使用c#。紧凑框架3.5。 在加载大量XML时,我得到一个OutofMemoryException。 手机的内存有限,但应该足以处理xml字符串的大小。 xml的字符串包含2 MB文件的base64内容。当xml字符串包含最大1.8 MB的文件时,代码将起作用 我完全不知道该怎么做。不确定如何更改任何内存设置 我已经包含了以下代码的精简副本。任何帮助表示赞赏。

 Stream newStream = myRequest.GetRequestStream();
                // Send the data.
                newStream.Write(data, 0, data.Length);
                //close the write stream 
                newStream.Close();
                // Get the response. 
                HttpWebResponse response = (HttpWebResponse)myRequest.GetResponse();
                // Get the stream containing content returned by the server.
                Stream dataStream = response.GetResponseStream();
                //Process the return
                //Set the buffer
                byte[] server_response_buffer = new byte[8192];
                int response_count = -1;

                string tempString = null;

                StringBuilder response_sb = new StringBuilder();
                //Loop through the stream until it is all written
                do
                {
                    // Read content into a buffer
                    response_count = dataStream.Read(server_response_buffer, 0, server_response_buffer.Length);
                    // Translate from bytes to ASCII text
                    tempString = Encoding.ASCII.GetString(server_response_buffer, 0, response_count);
                    // Write content to a file from buffer
                    response_sb.Append(tempString);
                }
                while (response_count != 0);
                responseFromServer = response_sb.ToString();
                // Cleanup the streams and the response.
                dataStream.Close();
                response.Close();
            }
            catch {
                MessageBox.Show("There was an error with the communication.");
                comm_error = true;
            }
              if(comm_error == false){
            //Load the xml file into an XML object

                  XmlDocument xdoc = new XmlDocument();
                  xdoc.LoadXml(responseFromServer);
              }

xdoc.LoadXML行发生错误。我已经尝试将流写入文件,然后将文件直接加载到xmldocument中,但它并没有更好。 完全陷入困境。

3 个答案:

答案 0 :(得分:4)

我建议您使用XmlTextReader类而不是XmlDocument类。我不确定您对读取xml的要求是什么,但XmlDocument非常占用内存,因为它会创建大量对象并尝试加载整个xml字符串。另一方面,XmlTextReader类只是在读取时扫描xml。

假设你有字符串,这意味着你会做类似下面的事情

        String xml = "<someXml />";
        using(StringReader textReader = new StringReader(xml)) {
            using(XmlTextReader xmlReader = new XmlTextReader(textReader)) {
                xmlReader.MoveToContent();
                xmlReader.Read();
                // the reader is now pointed at the first element in the document...
            }
        }

答案 1 :(得分:0)

您是否尝试从流而不是从字符串加载(这与写入流不同,因为在您的示例中,您仍尝试使用XmlDocument将其全部加载到内存中)?

还有其他用于XML文件的.NET组件,它们将XML作为流使用,而不是一次性加载所有这些组件。问题是.LoadXML可能会尝试一次处理整个文档,将其加载到内存中。不仅如此,你已经将它加载到一个字符串中,因此它在内存中以两种不同的形式存在,进一步增加了你没有足够的可用连续内存的可能性。

你想要的是通过一个XmlReader将它写成流的一些方法,这样你就可以开始阅读XML文档,而无需将整个内容加载到内存中。当然这种方法存在局限性,因为XmlReader只是前向和只读,并且它是否可以工作取决于你在加载XML后想要做什么。

答案 2 :(得分:0)

我不确定你为什么以你的方式阅读xml,但它可能是非常低效的内存。如果垃圾收集器没有启动,你可以在内存中有3个以上的文档副本:在字符串构建器,字符串和XmlDocument中。

更好地做一些事情:

XmlDocument xDoc = new XmlDocument();
Stream dataStream;
try {
  dataStream = response.GetResponseStream();
  xDoc.Load(dataStream);
} catch {
 MessageBox.Show("There was an error with the communication.");
} finally {
  if(dataStream != null)
    dataStream.Dispose();
}