我目前正在尝试将一个稍大的 xml 文件加载到数据集中。 xml 文件大约有 700 MB,每次我尝试读取 xml 时都需要大量时间,一段时间后它会抛出“内存不足”异常。
DataSet ds = new DataSet();
ds.ReadXml(pathtofile);
主要问题是,我有必要使用这些数据集(我用它将数据从xml文件导入到sybase数据库(foreach表,foreach行,foreach列)),并且我没有方案文件。
我已经用谷歌搜索了一段时间,但我只找到了对我来说不可用的解决方案。
附加信息: 我使用 Sybase (ASA 9) 数据库,但我的 C# 应用程序在处理数据库之前崩溃了。当我将 XML 读入数据集并想要使用 ds 时,会发生该错误。我已经读到这是使用大内容数据集时的一个已知错误。我至少需要一次数据集中的数据,因为我需要将其导入数据库。
您也许能够使用 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%)。
祝你好运,我希望这会有所帮助!
您需要找到一种“惰性”读取 XML 文件的方法,而不是立即将其全部放入内存中。
此知识库文章展示了如何逐个元素读取 XML 文件 http://support.microsoft.com/kb/307548
我建议采用该示例并对其进行修改以执行您的任务。
我想我们需要的还不止这些。您使用什么程序?什么数据库? C# 崩溃还是数据库崩溃?或者你的浏览器?
主要解决方案是通过参数为抛出内存不足异常的部分(我猜那是您的 C# 应用程序)提供更多内存。至少如果是 Java 程序我会这么做。
经过长时间的尝试,我使用了这个方法,到目前为止它有效。
var ds = new DataSet();
ds.ReadXmlSchema(xmlFilePath);
ds.ReadXml(xmlFilePath, XmlReadMode.IgnoreSchema);
此方法加载架构,然后将数据行读入数据集。 我已经尝试过 2M 行,效果很好。