Разбор больших xml-файлов (1G +) в node.js

Мне сложно найти пакет узла, который может анализировать большие XML-файлы размером 1G +. Наш внутренний сервер - это в первую очередь node.js, поэтому мне не хотелось бы создавать еще одну службу на другом языке / платформе только для анализа xml и записи данных в базу данных. Кто-нибудь имел успех, делая такие вещи в узле? Что вы использовали? Я просмотрел кучу пакетов, таких как xml-stream, big-xml и т. д., И у всех есть свои проблемы. Некоторые даже не могут скомпилироваться на Mac (и кажутся устаревшими и больше не поддерживаются). Мне действительно не нужно преобразовывать проанализированные результаты в объекты js или что-то в этом роде. Просто нужно разобраться в данных, а затем записать в базу данных.

Да, я также ищу что-нибудь разумное для использования с моим каркас ГПВД - это может быть то, что вы, возможно, захотите использовать на более позднем этапе, но оно должно быть снабжено чем-то вроде "саксофонного" процессора ...

Michał Karpacki 14.09.2018 14:42

Вы это проверили? github.com/isaacs/sax-js.

Michał Karpacki 14.09.2018 14:42

@ MichałKapracki: да, я пробовал саксофон, но он кажется чертовски медленным и громоздким в использовании.

u84six 14.09.2018 17:41

Хм ... странно. Насколько я помню, sax был на самом деле быстрее, чем libxml. У меня сейчас нет времени, но я проверю и попробую соединить несколько образцов с ГПД, как я хотел, и опубликовать свои выводы по синтаксическим анализаторам здесь ...

Michał Karpacki 14.09.2018 17:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
4
5 578
1

Ответы 1

Самый очевидный, но не очень полезный ответ - это то, что это зависит от требований.

Однако в вашем случае это кажется довольно простым; вам необходимо загрузить большие фрагменты данных, которые могут поместиться или не поместиться в памяти, для простой обработки перед их записью в базу данных. Я думаю, что это уже одна хорошая причина, по которой вы захотите вывести работу процессора как отдельные процессы. Поэтому, вероятно, было бы разумнее сначала сосредоточиться на том, какой анализатор XML выполняет эту работу за вас, а не на том, какую оболочку узла вы хотите использовать для этого.

Очевидно, что любой синтаксический анализатор, который требует, чтобы весь документ был загружен в память перед обработкой, не является допустимым вариантом. Для этого вам нужно будет использовать потоки и парсеры, поддерживающие такую ​​последовательную обработку.

Это оставляет вам несколько вариантов:

Saxon, кажется, имеет самый высокий уровень соответствия последним спецификациям W3C, поэтому, если проверка схемы и тому подобное важны, это может быть хорошим кандидатом. В противном случае и Libxml, и Expat кажутся складываются довольно хорошо с точки зрения производительности и уже предустановлены в большинстве операционных систем.

Для всего этого доступны оболочки Node:

Моя реализация Node будет выглядеть примерно так:

import * as XmlStream from 'xml-stream'
import { request } from 'http'
import { createWriteStream } from 'fs'

const xmlFileReadStream = request('http://external.path/to/xml')
const xmlFileWriteStream = new XmlStream(xmlFileReadStream)
const databaseWriteStream = createWriteStream('/path/to/file.csv')

xmlFileWriteStream.on('endElement: Person', ({ name, phone, age }) =>
  databaseWriteStream.write(`"${name}","${phone}","${age}"\n`))

xmlFileWriteStream.on('end', () => databaseWriteStream.end())

Конечно, я понятия не имею, как будет выглядеть ваш поток записи в базу данных, поэтому здесь я просто записываю его в файл.

эй :) если вы не знали, что существует узел 'person' - как вы могли бы разобрать этот xml?

Roey Zada 03.02.2020 06:01

Другие вопросы по теме