День добрый. У меня есть необходимость импортировать большое кол-во данных (от 50ГБ до 1ТБ) из довольно "кривых" xml-файлов в СУБД mssql.
Использовать sqlxmlbulkload не получится, потому что данные в xml необходимо править перед импортом. Есть мысль сделать свой парсер xml (так как набор полей/тегов в xml постоянен и ограничен (20 возможных полей)) и преобразовывать xml в cvs, а потом грузить в БД через bulkinsert.
Пробовал использовать Msxml2.DOMDocument — работает хорошо на небольших файлах, а на файлах от 2ГБ жутко тормозит, так что похоже надо писать свой парсер.
Подскажите какой язык лучше использовать для написания подобного парсера для больших файлов, желательно скриптовый...
ЗЫ. и еще вопрос можно ли на таком языке использовать "входной поток", чтобы можно было (если файлы заархивированы) сразу направлять поток из архиватора на вход скрипту/парсеру, дабы не создавать временных разархивированых файлов?
Здравствуйте, .alex, Вы писали:
A>Пробовал использовать Msxml2.DOMDocument — работает хорошо на небольших файлах, а на файлах от 2ГБ жутко тормозит, так что похоже надо писать свой парсер.
Возможно, вам подойдёт потоковый парсер типа XmlReader
A>Подскажите какой язык лучше использовать для написания подобного парсера для больших файлов, желательно скриптовый...
Лучше всего взять готовый парсер. В XML много тонкостей, если хотите парсить произвольный XML. Находитесь по граблям, если будете писать свой.
Если XmlReader не подходит, можно поискать другие поточные парсеры.
A>ЗЫ. и еще вопрос можно ли на таком языке использовать "входной поток", чтобы можно было (если файлы заархивированы) сразу направлять поток из архиватора на вход скрипту/парсеру, дабы не создавать временных разархивированых файлов?
На С# — можно точно.
Здравствуйте, .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, которая ползет по большому файлу, и на лету строку за строкой заполняет данные в таблице на сервере. Предварительно обработав.
Получилось неплохо. Правда неуниверсально.
Здравствуйте, vmpire, Вы писали:
V>Возможно, вам подойдёт потоковый парсер типа XmlReader
Он точно не тянет весь XML в память? Подзабыл, но почему-то сомневаюсь.
Здравствуйте, Mihas, Вы писали:
V>>Возможно, вам подойдёт потоковый парсер типа XmlReader M>Он точно не тянет весь XML в память? Подзабыл, но почему-то сомневаюсь.
Точно не тянет. Для того и сделан.
Здравствуйте, vmpire, Вы писали:
V>Здравствуйте, .alex, Вы писали:
A>>Пробовал использовать Msxml2.DOMDocument — работает хорошо на небольших файлах, а на файлах от 2ГБ жутко тормозит, так что похоже надо писать свой парсер. V>Возможно, вам подойдёт потоковый парсер типа XmlReader
Отлино! поточный парсер это кажется именно то что нужно! Только можно чуть подробнее? Это библиотека? Могу я использовать ее, например как COM объект из vbs? Или только из каких-то определенных языков?
Здравствуйте, .alex, Вы писали:
A>...
A>Отлино! поточный парсер это кажется именно то что нужно! Только можно чуть подробнее? Это библиотека? Могу я использовать ее, например как COM объект из vbs? Или только из каких-то определенных языков?
Такой вид парсера есть почти на всех языках. Если вам нужна скорость — вам нужен SAX парсер XML. DOM парсер "тянет" весь XML в память и преобразует в дерево, он точно будет медленне для вашего случая.