Как читать очень большой (>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');
        }
});

это работало хорошо :)