【问题标题】:Reading large Xml files downloaded from a zip and loaded into MemoryStream [duplicate]读取从 zip 下载并加载到 MemoryStream 中的大型 Xml 文件 [重复]
【发布时间】:2014-08-17 12:38:44
【问题描述】:

我正在阅读非常大的 Xml 文件 (400+ MB),压缩后的 15 MB 已下载并解压缩到 MemoryStream。我每次都遇到System.OutOfMemoryException。我尝试使用StreamReader.ReadToEnd() 并将其读入字符串,但不起作用。

我四处搜索并使用XmlReader 并将其加载到XElement,正如此处的帖子所建议的那样。但是,我仍然遇到OutOfMemoryException 错误。

string downloadUrl = requestStatus.ReportDownloadUrl;

//create a network stream to the report Url
using (Stream reportZipStream = new WebClient().OpenRead(downloadUrl)) //download the file
using (Stream reportZipMemoryStream = new MemoryStream()) //initilize zip memorystream
using (Stream reportXmlStream = new MemoryStream()) //load xml file to memorystream for manipulation
{
    //copy zip file to memorystream
    reportZipStream.CopyTo(reportZipMemoryStream);
    reportZipMemoryStream.Seek(0, SeekOrigin.Begin);

    //unzip to Xml memory stream
    using (ZipFile reportZip = ZipFile.Read(reportZipMemoryStream))
    {
        reportZip[0].Extract(reportXmlStream);
    }

    reportXmlStream.Seek(0, SeekOrigin.Begin);

    Dictionary<string, object> parsedXml = default(Dictionary<string, object>);

    //read and parse
    if (reportXmlStream.CanRead && reportXmlStream.Length > 0)
    {
        XmlDataParser parser = new XmlDataParser();
        using (XmlReader reader = XmlReader.Create(reportXmlStream))
        {
            XElement elem = XElement.Load(reader); //out of memory error here
            parsedXml = parser.doParse(elem);
        }
    }

【问题讨论】:

  • XElement.Load 将加载整个 url/流,所以你知道。
  • 关于如何在 C# 中处理大型 xml 文件已关闭为重复。
  • 机器上有多少内存?机器是64位的吗?
  • 我的机器是 4GB 64bit

标签: c# xml xmlreader memorystream xelement


【解决方案1】:

您不应该对 400 Mo XML 文件使用 DOM 解析器(例如 XElement)。您应该使用 SAX 解析器。

【讨论】:

  • 为什么不使用已经在 .NET 框架中的那个 - 哎呀 - 呢?无知还是真正的原因?
  • 无知。我是新的。 .NET 中有什么库?
猜你喜欢
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多