【问题标题】:Large XML files in dataset (outofmemory)数据集中的大型 XML 文件(内存不足)
【发布时间】:2011-02-09 16:52:11
【问题描述】:

我目前正在尝试将一个稍大的 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


    【解决方案1】:

    我想,我们需要的远不止这些。你在用什么程序?什么数据库? C# 会崩溃还是数据库崩溃?还是你的浏览器?

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        也许可以使用 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%)。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-09
          • 1970-01-01
          • 2013-07-09
          • 2011-12-25
          • 2021-11-14
          • 1970-01-01
          • 2023-04-09
          相关资源
          最近更新 更多