Нужно прочитать данные из огромного xml файла, например размером 50Gb, файл представляет из себя root элемент с коллекцией похожих нод (одно название, одинаковый почти всегда набор атрибутов и вложенных нод), заранее структура каждой ноды не известна, некоторые поля должны читаться как же есть, некоторые преобразовываться/высчитываться на лету или после чтения всех остальных полей. Перед разбором xml не известна структура сущности в файле, все ложится в БД, список таблиц и столбцов может меняться на протяжении жизни приложения, есть правила по которым разбираем xml, например:
- из атрибута
PrimaryKey
считаем hash значения, если есть и ложим в ячейку KeyHash
каждой таблицы
- для ячейки
XXXId
смотрим родительскую и дочернюю ноду с именем XXX
и из неё забираем значение
- планируется зависимость от файла с рулами более сложными, так что
SqlBulkCopy
сразу в БД не вариант
- и т.д.
Самое логичное решение читать по одной ноде из файла через
while(reader.read()){}
и хранить все это в памяти в массивах, потом сваливать в БД, когда наберется достаточно данных (через
sqlbulkcopy(writetoserver(idatareader)))
, но проблема в том, распарсили даже пару гигабайт занимает очень много времени. На странице есть описание парсека с красивыми результатами обработки, но инфа по этой либе я что-то не нахожу.
Вопрос: как максимально быстро можно разобрать xml на части (забрать родительский элемент, дочерний, проверить есть ли нода с именем начинающимся на XXX или забрать атрибут по имени), стандартный LINQ to XML работает медленно, какие быстрые и стабильные, с хорошей документацией есть либы для .net приложения?