【问题标题】:Generating very large XML file with Linq-to-XML and Linq-to-SQL使用 Linq-to-XML 和 Linq-to-SQL 生成非常大的 XML 文件
【发布时间】:2009-11-08 17:30:43
【问题描述】:

我正在尝试将一个非常大的数据库(数 GB)转储到 XML。我使用 Linq-to-SQL 从数据库中获取数据,使用 Linq-to-XML 生成 XML。我使用XStreamingElement 来保持低内存使用。然而,在没有编写任何 XML 的情况下,该作业仍会分配所有可用内存。结构如下:

var foo =
    new XStreamingElement("contracts",
       <LinqtoSQL which fetches data>.Select(d =>
    new XElement("contract",
        ... generate attributes etc...
using (StreamWriter sw = new StreamWriter("contracts.xml"))
{
    using (XmlWriter xw = XmlWriter.Create(sw))
    {
        foo.WriteTo(xw);
    }
}

我也尝试过保存:

foo.Save("contracts.xml", SaveOptions.DisableFormatting);

...无济于事。

有什么线索吗?

【问题讨论】:

  • 序列化为sql怎么样?它会很大,但至少你可以按顺序阅读它......

标签: c# .net linq linq-to-sql linq-to-xml


【解决方案1】:

数据有多复杂?我对XStreamingElement 不太熟悉,但不知道您是否会更喜欢直接使用XmlWriter?特别是对于循环中的相似数据,它可以很容易地使用。

但是,我会担心将 xml 作为此数据的选择。这是s的要求吗?或者只是一种方便的可用格式?特别是,很难方便地解析那种大小的 xml,因为您必须使用 XmlReader(这比 XmlWriter 更难正确)。

如果您可以使用其他格式,我建议您使用它...一些跳跃的想法,但除非您提到您会感兴趣,否则我不会喋喋不休。 p>

【讨论】:

    【解决方案2】:

    当然,您只需要一条线索:不要这样做。 :-)

    XML 不适合用于数据库转储,因为它不能很好地处理大量数据。

    所有数据库都有某种“转储”实用程序,可以将其数据导出为一种格式,然后可以读取到另一个数据库中——这就是要走的路。

    【讨论】:

    • 我确信 friism 尝试转储到 XML 是有正当理由的。
    • 尝试将 1 gig 的数据库数据转储为 20 gig 的 XML 从来没有一个好的理由。 :-)
    • 这不是一个纯粹的转储,只包含一些列并且涉及一些处理。我这样做的原因是因为我想让数据对不使用 SQL Server 的其他人可用(现在,它将被导入 MySQL)。我承认你的观点,但这是一个很好的观点。通过压缩,开销应该不会是灾难性的。
    • 每个数据库都可以以极快的速度从平面数据文件中导出和导入(几秒钟内就可以完成几条 10 万条记录)。压缩后的 XML 仍然必须解压缩才能处理,并且与平面文件加载相比会非常缓慢 - 您要导出多少相关表/记录?
    • 有超过 100.000 行(“合同”),每个合同可能有几十个相关行(“合同获胜者”等)。是否有具有良好工具的良好跨平台平面文件格式?如果是这样,我很想听听。
    【解决方案3】:

    没错,通过将我的数据分成 10,000 个项目的集合并将它们写入单独的 XML 文件,“解决了”这个问题。会考虑其他数据交换格式并购买更大的服务器。

    如果有人知道如何正确利用XStreamingElement,我仍然会非常有趣。

    【讨论】:

    • 我认为XStreamingElement 不是问题。您是否尝试使用单个 LINQ to SQL 查询从 SQL Server 获取所有数据?如果是这样,仍然需要分配内存来处理 LINQ to SQL 查询的结果。我会尝试以较小的块从数据库中获取数据,例如使用Skip/Take 组合,就像您尝试制作分页系统一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多