【问题标题】:Save large result set to multiple XML files将大型结果集保存到多个 XML 文件
【发布时间】:2016-06-07 21:40:25
【问题描述】:

我有一个返回大型结果集(近 2000 万条记录)的存储过程。我需要将此结果保存到多个 XML 文件中。我目前正在使用 ADO.Net 来填充数据集,但它很快就会抛出 System.OutOfMemoryException。我还可以使用哪些其他方法来完成此操作?

【问题讨论】:

  • 使用可以流式传输的 xml 库。例如吐出 xml 而不需要整个数据结构都在内存中/可用。读取一条记录,吐出该记录的 xml,重复。
  • 除了填写DataSet,您能否获得适当的DataReader 并使用XmlWriter 将其流式传输到文件?
  • 我会使用 SQL Server 附带的 sqlcmd.exe:msdn.microsoft.com/en-us/library/ms162773.aspx。 20M 不是 SQL 的一个非常大的输出,可能非常快,也可能需要长达一个小时,具体取决于 SQL 数据库的大小和数据的存储方式。通过 c# 处理命令时可以将处理时间增加 10 倍。我不知道您的查询需要多长时间,但如果时间很长,我会推荐 sqlcmd.exe。我有一个以 ac# 形式完成的应用程序,并且应用程序冻结了。我最终创建了一个后台工作程序,它产生了一个调用 sqlcmd.exe 的进程。有代码。
  • 我是否理解正确:您的 SP 返回数百万行。您想将结果写入许多单独的 XML 文件中吗?正确的?什么是分组决策?文件是如何分隔的(每个客户一个...)?
  • @TL,是否有合适的标准来划分您的组?我只是想像 permonthper customerper product 或类似的东西......在这种情况下,您可以添加一个索引列与您的分组区分器并按组加载数据?最简单的是运行编号和负载范围...无论如何,您都不应该使用 load all 并准备 XML files 方法...您可能会使用比存储过程更好的表值函数,这取决于...从 SS2012 开始,您可能会读到 OFFSET FETCH

标签: c# sql xml ado.net


【解决方案1】:

你用的是sql server吗?

在这种情况下,有一条 sql 指令可以自动将查询结果转换为 xml 结构,然后您可以在应用程序中将其作为字符串获取。

选项:

  • 您将字符串拆分为多个字符串并将它们保存到文件中(在应用程序中)

  • 修改 PS 以将结果拆分为多个 xml 对象,然后将它们作为不同的字符串/行(1 行 => 1 个对象)并将它们中的每一个保存到一个文件中。

  • 编写一个新的 PS 调用原始 PS,将结果拆分为 X 个 xml 对象,然后返回您只需保存在应用程序中的 X 个 xml 字符串

不使用 sql server 吗?

在 PS 中进行 XML 格式化或编写一个新的格式

无论如何,如果认为做xml格式化服务器端会更容易

【讨论】:

    【解决方案2】:

    假设您使用的是 SQL Server - 您可以在存储过程中使用分页。 ROW_NUMBER 是一个选项。 SQL Server 2012 及以上版本支持OFFSET and FETCH

    另外,您要填写多少个数据表?数据表有行数限制。

    一个DataTable可以存储的最大行数是16,777,216

    https://msdn.microsoft.com/en-us/library/system.data.datatable.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 2014-09-24
      相关资源
      最近更新 更多