Узел.JS, сокет.Ввод-вывод и большие XML-файлы: экстремальная потеря производительности?

#xml #file #node.js #socket.io

#xml #файл #node.js #socket.io

Вопрос:

На днях я наткнулся на неприятную проблему: Я использую XML-строки для связи между сервером и клиентом и обмена точно определенными пользовательскими данными. Работает нормально до тех пор, пока размер XML-файла не слишком велик.

Но в одном случае мне нужно передать XML-файл с ~ 35000 строками, который на стороне клиента приводит к HTML-таблице с ~ 2200 строками таблицы. На сервере я использую этот fs.readFile() метод, а затем немедленно отправляю его содержимое. Это занимает много времени (или, если быть точным: мин. 6 секунд) до socket.on('message') вызова -handler на клиенте.

Я новичок в Node.js и вчера весь день гуглил. Есть ли у кого-нибудь идея о том, как ускорить чтение XML-файла и его передачу в данной среде, хотя бы немного?

Ответ №1:

Я получил 3 предложения, которые могут повысить производительность:

  • Используйте JSON, а не XML. Гораздо быстрее разбирается и иногда имеет меньший размер, чем XML. Вы можете использовать node-expat для преобразования XML в JSON. Посмотрите этот тест.
  • Создайте таблицы на стороне сервера. Сервер, очевидно, быстрее, чем клиенты. Тогда вы также можете использовать кэширование.
  • Я думаю, что лучше использовать прямые вызовы AJAX, сокет.ввод-вывод тяжелый, и я не думаю, что он не предназначен для тяжелых объектов.

Комментарии:

1. Эй, Альфред, я думаю, ты прав с JSON, спасибо! Я определенно дам этому шанс. Моя задача сейчас, к сожалению, состоит в том, чтобы увидеть, как далеко я продвинулся с помощью WebSocket с точки зрения производительности, поскольку стоит попробовать полнодуплексную связь…

2. Да, использование JSON сократило время ожидания на ~ 75%!

Ответ №2:

Я использовал https://github.com/astro/node-expat/blob/master/lib/node-expat.js для анализа огромного XML-файла объемом 37 ГБ. Он поддерживает потоковую передачу файлов и отлично работает.

 var expat = require('node-expat');
var fs = require('fs');
var parser = new expat.Parser("UTF-8");
// set up your event listeners here
var fname = "path/to/your/file.xml";
fs.createReadStream(fname).pipe(parser);
 

Настройка прослушивателей событий в стиле sax довольно проста, дайте мне знать, если вам нужна помощь в этом.