Чтение и запись XML как реляционных данных - лучшие практики

Я должен сделать следующее:
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 ответа

Решение

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

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

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

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

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

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

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

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

Другие вопросы по тегам