2010-09-16 26 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