Как читать очень большой (>1GB) tar.GZ файлы в узел.Яш?
мне никогда не приходилось делать этого раньше, так что это, вероятно, что-то действительно основное, но я думал, что спрошу в любом случае.
Как правильно читать очень большой файл в узле.Яш? Скажем, файл слишком большой, чтобы читать все сразу. Также скажите, что файл может войти как .zip
или .
первый вопрос, лучше ли сначала распаковать файл и сохранить его на диск (я использую Stuffit на Mac, чтобы сделать это сейчас), а затем работать с этим файлом? Или вы можете прочитайте поток ввода-вывода прямо из сжатого .zip
или .tar.gz
версия? Я думаю, вам нужно знать формат содержимого в сжатом файле, поэтому вам, вероятно, придется распаковать (только что узнал это на самом деле )...
тогда основная проблема заключается в том, как я могу прочитать этот большой файл в узле.Яш? Скажем, это XML-файл 1GB, где я должен искать, чтобы начать его разбор? (Нет, как анализировать XML, но если Вы читаете большой файл строка за строкой, как это сделать вы анализируете что-то вроде XML, который должен знать контекст предыдущих строк).
Я видел fs.createReadStream
, но я боюсь с ним возиться... не хочу взрывать свой компьютер. Просто ищу несколько указателей в правильном направлении.
2 ответов
встроенный zlib модуль для декомпрессии потока и Сакс для синтаксического анализа XML потока
var fs = require('fs');
var zlib = require('zlib');
var sax = require('sax');
var saxStream = sax.createStream();
// add your xml handlers here
fs.createReadStream('large.xml.gz').pipe(zlib.createUnzip()).pipe(saxStream);
мы также можем zip каталог что-то вроде следующего :
var spawn = require('child_process').spawn;
var pathToArchive = './very_large_folder.tar.gz';
var pathToFolder = './very_large_folder';
var tar = spawn('tar', ['czf', pathToArchive, pathToFolder]);
tar.on('exit', function (code) {
if (code === 0) {
console.log('completed successfully');
} else {
console.log('error');
}
});
это работало хорошо :)