#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 довольно проста, дайте мне знать, если вам нужна помощь в этом.