Разбор больших XML-файлов (1G +) в node.js - PullRequest
0 голосов
/ 13 сентября 2018

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

1 Ответ

0 голосов
/ 31 декабря 2018

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

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

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

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

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())

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

...