olhapi
@olhapi
front-end

Как импортировать огромный XML в MongoDB?

Есть увесистый (700+ мб, 1.7 миллиона записей) XML файл с данными, которые нужно добавить в MongoDB. Перепробовал множество npm пакетов, консольных утилит и десктопных программ. Ни одна толком не может обработать файл такого объема в нужном виде (не xml "дерево").

Пример объекта который записывается:
5e32149402970431759542.png

Остановил свой выбор на пакете xml-stream. Он считывает стрим и выдает js объекты на выходе и все хорошо пока я ограничиваюсь выводом в консоль. Но появляются проблемы при любом ассинхронном выводе этих данных, например, при записи этих данных в монгу.

При попытке сохранить несколько записей в массив и потом массово их записать в БД им присваиваются идентичные айди и выкидывается ошибка. В текущей версии же просто ничего не происходит после запуска и соединения с БД. Ни ошибок, ни логов, ничего.
При попытке записать в файл дальше его создания дело не идет.
При записи в БД по одному успешно добавляются первые 214065 записей, а дальше соединение с монгой "падает" (MongoError: Topology is closed, please connect). Предположительно ошибка в XML (хотя это официальные данные с data.gov.ua) или проблема в парсере.
Пример файла для записи с несколькими вариантами вывода - https://pastebin.com/K3cLFsws
Последний вывод в консоль объекта для записи перед "падением" монги - https://pastebin.com/fWa7c7mD

Помогите разобраться как добавить эти данные в БД. Целый день голову ломаю над этим.

update: Решил проблему застревания на 214065 записях. Оказывается архиватор криво извлекал файл и он резался. Полный же файл 5ГБ. xml-stream нормально справился и данные в базу я добавил. Но остается открытым вопрос записи в БД пачками чтобы повысить производительность.
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 2
firedragon
@firedragon
Senior .NET developer
Размер не такой уж большой, но техника примерна такая
Используйте потоковый парсер
https://www.npmjs.com/package/sax

По скорости, собирайте набор из документов 100 - 1000 и вставляйте за раз
https://docs.mongodb.com/manual/reference/method/B...
Ответ написан
Oleg Vdovenko .... присваиваются идентичные айди и выкидывается ошибка. ... не верится что то - если напр белый шум инсертить тоже будет коллизии или нет ?
да ? пробуйте последовательно .

XML перегоните в json - тьма кода это умеет и просто самому написать - (кстати я бы на вашем месте на джаве это сделел - или на дотнете - или на руби или уж в крайнем случае на питоне ) - мне кажется любая из этих альтернатив всяко надежнее
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы