gpt4 book ai didi

c# - 如何克服从 API 中提取大型 xml 文档的 OutOfMemoryException?

转载 作者:太空狗 更新时间:2023-10-30 00:26:02 27 4
gpt4 key购买 nike

我正在从 API 中提取超过 100 万条记录。拉动工作正常,但在尝试将 ReadToEnd 放入字符串变量时出现内存不足异常。

代码如下:

        XDocument xmlDoc = new XDocument();

HttpWebRequest client = (HttpWebRequest)WebRequest.Create(uri);
client.Timeout = 2100000;//35 minutes
WebResponse apiResponse = client.GetResponse();

Stream receivedStream = apiResponse.GetResponseStream();
StreamReader reader = new StreamReader(receivedStream);

string s = reader.ReadToEnd();

堆栈跟踪:

at System.Text.StringBuilder.ToString()
at System.IO.StreamReader.ReadToEnd()
at MyApplication.DataBuilder.getDataFromAPICall(String uri) in
c:\Users\RDESLONDE\Documents\Projects\MyApplication\MyApplication\DataBuilder.cs:line 578
at MyApplication.DataBuilder.GetDataFromAPIAsXDoc(String uri) in
c:\Users\RDESLONDE\Documents\Projects\MyApplication\MyApplication\DataBuilder.cs:line 543

我该怎么做才能解决这个问题?

最佳答案

听起来您的文件对于您的环境来说太大了。为大文件加载 DOM 可能会出现问题,尤其是在使用 win32 平台时(您尚未说明是否属于这种情况)。

您可以将 XmlReader 的速度和内存效率与 XElement/Xnode 等的便利性结合起来,并使用 XStreamingElement 来保存处理后的转换内容。这对于大文件来说内存效率更高

这是一个伪代码示例:

    // use a XStreamingElement for writing
var st = new XStreamingElement("root");
using(var xr = new XmlTextReader(stream))
{
while (xr.Read())
{
// whatever you're interested in
if (xr.NodeType == XmlNodeType.Element)
{
var node = XNode.ReadFrom(xr) as XElement;
if (node != null)
{
ProcessNode(node);
st.Add(node);
}
}

}
}
st.Save(outstream); // or st.WriteTo(xmlwriter);

关于c# - 如何克服从 API 中提取大型 xml 文档的 OutOfMemoryException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13710337/

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