gpt4 book ai didi

c# - 在 DataSet 上加载大型 XML(OutOfMemory 异常)

转载 作者:太空宇宙 更新时间:2023-11-03 12:49:05 24 4
gpt4 key购买 nike

我正在尝试通过 URl 读取一个 3GB 的 XML 文件并将所有作业存储在数据集中。 XML 看起来像这样:

    <?xml version="1.0"?>
<feed total="1621473">
<job>
<title><![CDATA[Certified Medical Assistant]]></title>
<date>2016-03-25 14:19:38</date>
<referencenumber>2089677765</referencenumber>
<url><![CDATA[http://www.jobs2careers.com/click.php?id=2089677765.1347]]></url>
<company><![CDATA[Broadway Medical Clinic]]></company>
<city>Portland</city>
<state>OR</state>
<zip>97213</zip>
</job>
<job>
<title><![CDATA[Certified Medical Assistant]]></title>
<date>2016-03-25 14:19:38</date>
<referencenumber>2089677765</referencenumber>
<url><![CDATA[http://www.jobs2careers.com/click.php?id=2089677765.1347]]></url>
<company><![CDATA[Broadway Medical Clinic]]></company>
<city>Portland</city>
<state>OR</state>
<zip>97213</zip>
</job>
</feed>

这是我的代码

XmlDocument doc = new XmlDocument();
doc.Load(url);
DataSet ds = new DataSet();
XmlNodeReader xmlReader = new XmlNodeReader(doc);

while (xmlReader.ReadToFollowing("job"))
{
ds.ReadXml(xmlReader);
}

但是我得到了内存超出限制的异常。在谷歌上浏览并发现了这个:

DataSet ds = new DataSet();
FileStream filestream = File.OpenRead(url);
BufferedStream buffered = new BufferedStream(filestream);
ds.ReadXml(buffered);

还是一样的异常。我还阅读了有关 XmlTextReader 的信息,但我不知道如何在我的案例中使用它。我知道为什么我会遇到异常,但我不知道如何克服它。谢谢

最佳答案

与其尝试将整个文件加载到 DataSet 或其他容器中,不如加载批处理并将每个批处理写入数据库,以便每次都可以清除保存该批处理的任何内容?

如何:对大型 XML 文档执行流式转换 https://msdn.microsoft.com/en-us/library/bb387013.aspx

        List<XElement> jobs = new List<XElement>();
using (XmlReader reader = XmlReader.Create(filePath))
{
XElement job;
reader.MoveToContent();
while (reader.Read())
{
if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "job"))
{
job = XElement.ReadFrom(reader) as XElement;
jobs.Add(job);

if (jobs.Count >= 1000)
{
// TODO: write batch to database
jobs.Clear();
}
}
}

if (jobs.Count > 0)
{
// TODO: write remainder to database
jobs.Clear();
}

}

使用数据集的替代方法。

        DataSet ds = new DataSet();
using (XmlReader reader = XmlReader.Create(filePath))
{
reader.MoveToContent();
while (reader.Read())
{
if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "job"))
{
ds.ReadXml(reader);

DataTable dt = ds.Tables["job"];
if (dt.Rows.Count >= 1000)
{
// TODO: write batch to database
dt.Rows.Clear();
}
}
}

if (ds.Tables["job"].Rows.Count > 0)
{
// TODO: write remainder to database
ds.Tables["job"].Rows.Clear();
}
}

关于c# - 在 DataSet 上加载大型 XML(OutOfMemory 异常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36292830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com