2

我应该做以下事情:
1) 读取一个巨大的(700MB ~ 1000 万个元素)XML 文件;
2)解析它保持顺序
3)使用SQL插入语句创建一个文本(一个或多个)文件以将其批量加载到数据库中;
4) 编写关系元组并将它们写回 XML。

我来这里是为了交流一些关于最好(== fast fast fast ...)方法的想法。我将使用 C# 4.0 和 SQL Server 2008。

我相信 XmlTextReader 是一个好的开始。但我不知道它是否可以处理这么大的文件。它是在实例化时加载所有文件还是仅在内存中保存实际读取行?我想我可以做一个while(reader.Read()),那应该没问题。

编写文本文件的最佳方法是什么?因为我应该保留 XML 的顺序(采用一些编号模式),所以我必须将树的某些部分保存在内存中以进行计算等......我应该使用 stringbuilder 进行迭代吗?

我将有两种情况:一种情况是每个节点(元素、属性或文本)都在同一个表中(即,将是同一个对象),另一种情况是每种类型的节点(只有这三种类型,没有注释等..) 我将在数据库中有一个表和一个代表这个实体的类。

我的最后一个具体问题是 DataSet 有多好ds.WriteXml?它会处理 10M 元组吗?也许最好从数据库中获取块并使用 XmlWriter ......我真的不知道。

我正在测试所有这些东西......但我决定发布这个问题来倾听你们,跳跃你的专业知识可以帮助我更正确和更快地做这件事。

提前致谢,

佩德罗·杜索

4

2 回答 2

5

我会为此使用SQLXML 批量加载组件。您为您的 XML 提供一个带有特殊注释的 XSD 架构,其中嵌入了到您的关系模型的映射。然后它可以非常快速地批量加载 XML 数据。

如果您的 XML 没有架构,您可以通过加载文件并从 XML 菜单中选择“创建架构”从 Visual Studio 创建一个。但是,您需要自己将映射添加到关系模型中。这个博客有一些关于如何做到这一点的帖子。

于 2010-09-16T20:33:53.510 回答
1

你猜怎么了?您没有 SQL Server 问题。您遇到了 XML 问题!

面对你的情况,我不会犹豫。我会使用 Perl 及其众多 XML 模块之一来解析数据,创建简单的制表符或其他分隔的文件以进行批量加载,并 bcp 生成的文件。

使用服务器解析 XML 有很多缺点:

  1. 不快,很有可能
  2. 根据我的经验,积极无用的错误消息
  3. 没有调试器
  4. 当上述其中一项被证明是真的时,无处可去

另一方面,如果您使用 Perl,您将获得逐行处理和调试、旨在指导程序员的错误消息,以及许多替代方案,如果您的首选软件包无法胜任这项工作。

如果你经常做这种工作并且不了解 Perl,那就学吧。它会多次回报你。

于 2010-09-18T22:50:31.393 回答