Подскажите как быть с импортом в БД
От: .alex Ниоткуда  
Дата: 17.11.16 13:32
Оценка:
День добрый. У меня есть необходимость импортировать большое кол-во данных (от 50ГБ до 1ТБ) из довольно "кривых" xml-файлов в СУБД mssql.
Использовать sqlxmlbulkload не получится, потому что данные в xml необходимо править перед импортом. Есть мысль сделать свой парсер xml (так как набор полей/тегов в xml постоянен и ограничен (20 возможных полей)) и преобразовывать xml в cvs, а потом грузить в БД через bulkinsert.
Пробовал использовать Msxml2.DOMDocument — работает хорошо на небольших файлах, а на файлах от 2ГБ жутко тормозит, так что похоже надо писать свой парсер.
Подскажите какой язык лучше использовать для написания подобного парсера для больших файлов, желательно скриптовый...

ЗЫ. и еще вопрос можно ли на таком языке использовать "входной поток", чтобы можно было (если файлы заархивированы) сразу направлять поток из архиватора на вход скрипту/парсеру, дабы не создавать временных разархивированых файлов?
Re: Подскажите как быть с импортом в БД
От: vmpire Россия  
Дата: 17.11.16 13:59
Оценка:
Здравствуйте, .alex, Вы писали:

A>Пробовал использовать Msxml2.DOMDocument — работает хорошо на небольших файлах, а на файлах от 2ГБ жутко тормозит, так что похоже надо писать свой парсер.

Возможно, вам подойдёт потоковый парсер типа XmlReader

A>Подскажите какой язык лучше использовать для написания подобного парсера для больших файлов, желательно скриптовый...

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

A>ЗЫ. и еще вопрос можно ли на таком языке использовать "входной поток", чтобы можно было (если файлы заархивированы) сразу направлять поток из архиватора на вход скрипту/парсеру, дабы не создавать временных разархивированых файлов?

На С# — можно точно.
Re: Подскажите как быть с импортом в БД
От: Mihas  
Дата: 17.11.16 14:13
Оценка:
Здравствуйте, .alex, Вы писали:

A> данные в xml необходимо править перед импортом.

Как вариант
1. Проанализировать XML-файлы своим глазом, разложить их на кучки с одинаковыми структурами.
2. Для каждой кучки написать свой XSLT-шаблон, который приведет файл к удобной структуре XML.
3. Простым селектом или балк-инсертом засосать все получившиеся XML в промежуточную таблицу. В поле типа XML или TEXT (тут я плаваю).
4. MSSQL умеет парсить XML и представлять в условно табличном виде. Справляется с большими объемами (единицы гигабайт жует по часу).

A> Есть мысль сделать свой парсер xml (так как набор полей/тегов в xml постоянен и ограничен (20 возможных полей)) и преобразовывать xml в cvs,

Имей в виду: XML-файлы часто засасываются парсерами в память целиком, что критично на здоровых файлах — разрастаются в разы и быстро приводят к переполнению

A> а потом грузить в БД через bulkinsert.

bulkinsert можно использовать и в самописанных парсерах.
Я писал обертку для bulkinsert, которая ползет по большому файлу, и на лету строку за строкой заполняет данные в таблице на сервере. Предварительно обработав.
Получилось неплохо. Правда неуниверсально.
Re[2]: Подскажите как быть с импортом в БД
От: Mihas  
Дата: 17.11.16 14:16
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Возможно, вам подойдёт потоковый парсер типа XmlReader

Он точно не тянет весь XML в память? Подзабыл, но почему-то сомневаюсь.
Re[3]: Подскажите как быть с импортом в БД
От: vmpire Россия  
Дата: 17.11.16 14:47
Оценка:
Здравствуйте, Mihas, Вы писали:

V>>Возможно, вам подойдёт потоковый парсер типа XmlReader

M>Он точно не тянет весь XML в память? Подзабыл, но почему-то сомневаюсь.
Точно не тянет. Для того и сделан.
Re[2]: Подскажите как быть с импортом в БД
От: .alex Ниоткуда  
Дата: 17.11.16 21:19
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Здравствуйте, .alex, Вы писали:


A>>Пробовал использовать Msxml2.DOMDocument — работает хорошо на небольших файлах, а на файлах от 2ГБ жутко тормозит, так что похоже надо писать свой парсер.

V>Возможно, вам подойдёт потоковый парсер типа XmlReader

Отлино! поточный парсер это кажется именно то что нужно! Только можно чуть подробнее? Это библиотека? Могу я использовать ее, например как COM объект из vbs? Или только из каких-то определенных языков?
Re[3]: Подскажите как быть с импортом в БД
От: A13x США  
Дата: 18.11.16 03:21
Оценка:
Здравствуйте, .alex, Вы писали:

A>...


A>Отлино! поточный парсер это кажется именно то что нужно! Только можно чуть подробнее? Это библиотека? Могу я использовать ее, например как COM объект из vbs? Или только из каких-то определенных языков?


Такой вид парсера есть почти на всех языках. Если вам нужна скорость — вам нужен SAX парсер XML. DOM парсер "тянет" весь XML в память и преобразует в дерево, он точно будет медленне для вашего случая.

Читать https://en.wikipedia.org/wiki/Simple_API_for_XML
Re[3]: Подскажите как быть с импортом в БД
От: vmpire Россия  
Дата: 18.11.16 12:20
Оценка:
Здравствуйте, .alex, Вы писали:

A>Отлино! поточный парсер это кажется именно то что нужно! Только можно чуть подробнее? Это библиотека? Могу я использовать ее, например как COM объект из vbs? Или только из каких-то определенных языков?

Это один из стандартных парсеров .NET. https://msdn.microsoft.com/en-us/library/system.xml.xmlreader(v=vs.110).aspx
Вот обзор (неполный) парсеров: https://msdn.microsoft.com/en-us/library/aa478996.aspx#aspnet-jspmig-xmlprocessing_topic3

Из VBS можно его использовать, если написать свою обёртку для COM.
Но из VBS проще использовать котовые COM объекты из MSXML, там есть SAX парсер.
Примеры, найденные навскидку:
https://msdn.microsoft.com/en-us/library/ms762776(v=vs.85).aspx (документация)
https://msdn.microsoft.com/en-us/library/ms753803(v=vs.85).aspx (как раз по вашей части(
https://msdn.microsoft.com/en-us/library/bb985162.aspx (просто статья)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.