Чтение и запись XML как реляционных данных - лучшие практики - PullRequest
2 голосов
/ 17 сентября 2010

Я должен сделать следующее:
1) прочитать огромный (700 МБ ~ 10 миллионов элементов) XML-файл;
2) разобрать сохранение порядка ;
3) создать текстовый (один или несколько) файл с инструкциями вставки SQL для массовой загрузки его в БД;
4) написать реляционные кортежи и записать их обратно в XML.

Я здесь, чтобы обменяться идеями о лучшем (== быстро, быстро, быстро ...) способе сделать это. Я буду использовать C # 4.0 и SQL Server 2008.

Я считаю, что XmlTextReader - хорошее начало. Но я не знаю, сможет ли он обработать такой огромный файл. Загружает ли он весь файл, когда создается его экземпляр, или содержит в памяти только фактическую строку чтения? Я полагаю, я могу сделать while(reader.Read()), и это должно быть хорошо.

Как лучше всего писать текстовые файлы? Поскольку я должен сохранить порядок XML (принимая некоторую схему нумерации), мне придется держать некоторые части дерева в памяти для выполнения вычислений и т. Д. Должен ли я выполнять итерации с помощью stringbuilder?

У меня будет два сценария: один, где каждый узел (элемент, атрибут или текст) будет находиться в одной и той же таблице (т. Е. Будет одним и тем же объектом), и другой сценарий, где для каждого типа узла (только эти три типа, без комментариев и т.д ..) У меня будет таблица в БД и класс для представления этой сущности.

Мой последний конкретный вопрос: насколько хорош DataSet ds.WriteXml? Будет ли он обрабатывать 10М кортежей? Может быть, лучше всего извлечь куски из базы данных и использовать XmlWriter ... Я действительно не знаю.

Я тестирую все эти вещи ... Но я решил опубликовать этот вопрос, чтобы выслушали вас, ребята, если вы поделитесь своими знаниями, это поможет мне сделать это более правильно и быстрее.

Заранее спасибо,

Педро Дуссо

Ответы [ 2 ]

5 голосов
/ 17 сентября 2010

Для этого я бы использовал компонент массовой загрузки SQLXML .Вы предоставляете специально аннотированную XSD-схему для вашего XML со встроенными отображениями в вашу реляционную модель.Затем он может невероятно быстро выполнить массовую загрузку данных XML.

Если у вашего XML нет схемы, вы можете создать ее из Visual Studio, загрузив файл и выбрав Создать схему в меню XML.Однако вам нужно будет самостоятельно добавить сопоставления в вашу реляционную модель. В этом блоге есть несколько сообщений о том, как это сделать.

1 голос
/ 19 сентября 2010

Угадай что? У вас нет проблемы с SQL Server. У вас проблема с XML!

Столкнувшись с вашей ситуацией, я бы не колебался. Я бы использовал Perl и один из его многочисленных XML-модулей для анализа данных, создания простых файлов с разделителями табуляции или других разделителей для массовой загрузки и создания результирующих файлов.

Использование сервера для анализа вашего XML имеет много недостатков:

  1. Не быстро, скорее всего
  2. Положительно бесполезные сообщения об ошибках, по моему опыту
  3. Нет отладчика
  4. Некуда поворачиваться, когда одно из вышеперечисленного оказывается верным

Если вы используете Perl с другой стороны, у вас есть построчная обработка и отладка, сообщения об ошибках, предназначенные для программиста, и множество альтернатив, если ваш первый выбор пакета окажется не для выполнения работы.

Если вы часто выполняете такую ​​работу и не знаете Perl, изучите ее. Это окупит вас много раз.

...