Чтение и запись 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 имеет много недостатков:
- Не быстро, более чем вероятно
- Положительно бесполезные сообщения об ошибках, по моему опыту
- Нет отладчика
- Некуда поворачиваться, когда одно из вышеперечисленного оказывается верным
С другой стороны, если вы используете Perl, у вас есть построчная обработка и отладка, сообщения об ошибках, предназначенные для программиста, и множество альтернатив, если ваш первый выбор пакета не выполнит эту работу.
Если вы часто выполняете такую работу и не знаете Perl, изучите ее. Это окупит вас много раз.
Я бы использовал компонент массовой загрузки SQLXML для этого. Вы предоставляете специально аннотированную XSD-схему для вашего XML со встроенными отображениями в вашу реляционную модель. Затем он может невероятно быстро загружать данные XML.
Если в вашем XML нет схемы, вы можете создать ее в Visual Studio, загрузив файл и выбрав "Создать схему" в меню XML. Однако вам нужно будет самостоятельно добавить сопоставления в вашу реляционную модель. В этом блоге есть сообщения о том, как это сделать.