数据集中的大型 XML 文件(内存不足)

问题描述 投票:0回答:4

我目前正在尝试将一个稍大的 xml 文件加载到数据集中。 xml 文件大约有 700 MB,每次我尝试读取 xml 时都需要大量时间,一段时间后它会抛出“内存不足”异常。

DataSet ds = new DataSet();
ds.ReadXml(pathtofile);

主要问题是,我有必要使用这些数据集(我用它将数据从xml文件导入到sybase数据库(foreach表,foreach行,foreach列)),并且我没有方案文件。

我已经用谷歌搜索了一段时间,但我只找到了对我来说不可用的解决方案。

附加信息: 我使用 Sybase (ASA 9) 数据库,但我的 C# 应用程序在处理数据库之前崩溃了。当我将 XML 读入数据集并想要使用 ds 时,会发生该错误。我已经读到这是使用大内容数据集时的一个已知错误。我至少需要一次数据集中的数据,因为我需要将其导入数据库。

c# xml dataset
4个回答
4
投票

也许能够使用 ReadXml 方法的重载来克服这个问题。相反,传入缓冲流,看看这是否可以加快速度。

这是代码:

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

根据您所讨论的数据大小,数据集本身可能会受到内存限制。 XML 的部分问题在于,仅仅由于元素名称和嵌套深度选择不当,它就可以将 500kb 的数据变成 500MB。由于您缺乏模式,您可以通过像上面一样读取文件来短路内存约束,并简单地将元素名称替换为较短的版本(例如,将

<Version></Version>
替换为
<V></V>
以减少 > 的字节数) 60%)。

祝你好运,我希望这会有所帮助!


1
投票

您需要找到一种“惰性”读取 XML 文件的方法,而不是立即将其全部放入内存中。

此知识库文章展示了如何逐个元素读取 XML 文件 http://support.microsoft.com/kb/307548

我建议采用该示例并对其进行修改以执行您的任务。


0
投票

我想我们需要的还不止这些。您使用什么程序?什么数据库? C# 崩溃还是数据库崩溃?或者你的浏览器?

主要解决方案是通过参数为抛出内存不足异常的部分(我猜那是您的 C# 应用程序)提供更多内存。至少如果是 Java 程序我会这么做。


0
投票

经过长时间的尝试,我使用了这个方法,到目前为止它有效。

var ds = new DataSet();
ds.ReadXmlSchema(xmlFilePath);
ds.ReadXml(xmlFilePath, XmlReadMode.IgnoreSchema);

此方法加载架构,然后将数据行读入数据集。 我已经尝试过 2M 行,效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.