我目前正在尝试将稍大的xml文件加载到数据集中。 xml文件大约700 MB,每次我尝试读取xml时都需要足够的时间,一段时间后会抛出“内存不足”异常。
DataSet ds = new DataSet();
ds.ReadXml(pathtofile);
主要问题是,我有必要使用这些数据集(我用它将数据从xml文件导入sybase数据库(foreach表,foreach行,foreach列))并且我没有计划文件。
我已经谷歌搜索了一段时间,但我只找到了对我无法使用的解决方案。
其他信息: 我使用Sybase(ASA 9)数据库,但在处理数据库之前,我的C#应用程序崩溃了。我将XML读入数据集并希望使用ds后发生错误。我已经读过,使用内容较大的数据集时,这是一个已知错误。我需要数据集中的数据至少一次,因为我需要将其导入数据库。
答案 0 :(得分:4)
你可能能够使用ReadXml方法的重载来解决这个问题。传递一个缓冲流,然后看看这是否能为您加速。
这是代码:
DataSet ds = new DataSet();
FileStream filestream = File.OpenRead(pathtofile);
BufferedStream buffered = new BufferedStream(filestream);
ds.ReadXml(buffered);
根据您所讨论的数据大小,数据集本身可能会受到内存限制。 XML的部分问题在于,它可能需要500kb的数据,并且只需选择不当的元素名称和嵌套深度就可以将其转换为500 MB。由于缺少模式,您可以通过读取上面的文件来缩短内存约束,并简单地用更短的版本替换元素名称(例如,将<Version></Version>
替换为<V></V>
以进行缩减以字节为单位> 60%)。
答案 1 :(得分:1)
你需要找到一种'懒洋洋地'读取XML文件的方法,而不是一次性将它全部存入内存。
这篇kb文章展示了如何按元素http://support.microsoft.com/kb/307548
读取XML文件元素我建议采用该示例并对其进行修改以执行您的任务。
答案 2 :(得分:0)
我想,我们还需要更多一点。你在用什么程序?什么数据库? C#崩溃还是数据库?还是你的浏览器?
主要的解决方案是给一个抛出内存不足的部分(我猜这是你的C#应用程序)带有参数的更多内存。至少那就是如果它是Java程序我会怎么做。