c# - 在 C# 中解析 80 Gb XML 文件

标签 c#

我必须解析 80 GB 的 XML 才能从该文件中获取一些数据。为此,我使用了 XML 阅读器。当我用 304 MB 文件检查代码时。然后它在 4 秒内解析文件。所以我想我会为 80 GB 工作。但它在几分钟后给了我异常的内存。

我有以下代码:

static void Main(string[] args)
    {

        List<Test> lstTest = new List<Test>();
        bool isTitle = false;
        bool isText = false;

        using (XmlReader Reader = XmlReader.Create(FilePath))
        {
            Test tt = new Test();
            while (Reader.Read())
            {                    switch (Reader.NodeType)
                {
                    case XmlNodeType.Element:
                        if (Reader.Name == "title")
                        {
                            isTitle = true;
                        }
                        if (Reader.Name == "text")
                        {
                            isText = true;
                        }
                        break;
                    case XmlNodeType.Text:
                        if (isTitle)
                        {
                            tt.Title = Reader.Value;
                            isTitle = false;
                        }

                        if (isText)
                        {
                            tt.Text = Reader.Value;
                            isText = false;
                        }
                        break;
                }

                if (tt.Text != null)
                {
                    lstTest.Add(tt);
                    tt = new Test();
                }
            }


        }
    }
}
}

所以请建议。感谢您的帮助。

最佳答案

您是对的,XmlReader 是正确的方法。内存不足的不是 XmlReader - 这是您的 lstTest,您将找到的大多数节点插入其中。

使用 XmlReader 的正确方法是处理节点然后忘记它们,继续前进。您可以将结果写入磁盘,或计算一些运行总计,或其他任何东西 - 但不要将您读取的所有内容都保存在内存中 - 这违背了 XmlReader 的目的。

关于c# - 在 C# 中解析 80 Gb XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39153428/

相关文章:

c# - 如何检查 Razor 模板中的模型中的属性是否可用?

c# - Windows Phone 7 动态磁贴推送通知?

当主窗体关闭时,C# 终止所有以 Application.Run 启动的进程

c# MongoDB 驱动程序 : FindOneAndUpdate how to know if it has found a document?

c# - 对数据库的多次访问。如何防止不同的线程修改相同的数据?

c# - 如何将图像的一部分插入图片框?

c# - 使用 Viewbox 模糊背景

c# - 托管 C++ 中的 List<Tuple<int, float>>

c# - 如何简化Where(e => e.prop1.contains() || e.prop2.contains() || ...)中的重复OR条件

c# - MVC4 - 当优化设置为 true 时捆绑不起作用