【发布时间】: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,是否有合适的标准来划分您的组?我只是想像 permonth 或 per customer 或 per product 或类似的东西......在这种情况下,您可以添加一个索引列与您的分组区分器并按组加载数据?最简单的是运行编号和负载范围...无论如何,您都不应该使用 load all 并准备 XML files 方法...您可能会使用比存储过程更好的表值函数,这取决于...从 SS2012 开始,您可能会读到
OFFSET FETCH