2010-09-16 37 views
2

我应该做下面的事情:
1)读取一个巨大的(700MB〜1000万个元素)XML文件;
2)解析它保存顺序;
3)用SQL插入语句创建一个文本(一个或多个)文件,将其批量加载到数据库上;
4)编写关系元组并将它们写回XML。读写XML作为关系数据 - 最佳实践

我在这里交流关于最佳(==快速快速...)方式的一些想法。我将使用C#4.0和SQL Server 2008.

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

什么是写入文本文件的最佳方式?因为我应该保留XML的顺序(采用一些编号模式),所以我将不得不在内存中保存一些部分的树来进行计算等等......我应该用stringbuilder迭代吗?我将有两种情况:一种是每个节点(元素,属性或文本)将在同一个表中(即将是同一个对象),另一种情况是对于每种类型的节点(只有这三种类型,没有评论等。)我将有一个表中的数据库和一个类来表示这个实体。

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

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

由于提前,

佩德罗Dusso

+0

有人做SAX解析了吗? – kurosch 2010-09-16 20:29:34

+0

我在.NET中使用'XmlReader',不要错过SAX。 – 2010-09-17 00:52:53

+0

SAX是什么意思? – 2010-09-17 12:17:57

回答

1

猜猜看是什么?您没有SQL Server问题。你有一个XML问题!

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

使用服务器来解析您的XML有许多缺点:

  1. 并不快,更可能
  2. 积极无用的错误消息,在我的经验
  3. 没有调试
  4. 无门时其中之一证明是真的

如果您使用Perl,另一方面,您有一行一行处理和调试,旨在引导程序员的错误消息,以及许多选择,如果你的第一个选择包没有完成这项工作。

如果你经常做这类工作而不了解Perl,请学习它。它会多次报答你。

5

我会用SQLXML Bulk Load Component这一点。您为您的XML提供特别注释的XSD架构,并在其中嵌入您的关系模型映射。然后它可以快速批量加载XML数据。

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

+0

我可以以编程方式创建此XSD吗?我将收到一个未知的XML文件,没有附加任何模式。 – 2010-09-17 12:19:27

+0

我研究了SQLXML批量加载。这是一个非常具体的场景,你可以在其中构建一个非常好的xsd。我有很多指导原则和限制。这将是很难产生一个很好的xsd架构加载后它未知的文件将来到:( – 2010-09-17 18:19:26