12 votes

Comment lire des fichiers tar.gz très volumineux (> 1 Go) en Node.js ?

Je n'ai jamais eu à faire cela auparavant, donc c'est probablement quelque chose de vraiment basique, mais je pensais demander quand même.

Quelle est la bonne manière de lire un fichier très volumineux en Node.js ? Disons que le fichier est trop volumineux pour être lu en une seule fois. Disons aussi que le fichier pourrait être sous forme de .zip ou .tar.gz.

Première question, est-il préférable de décompresser le fichier d'abord et de le sauvegarder sur le disque (je suis en train d'utiliser Stuffit sur Mac pour le faire maintenant), puis de travailler avec ce fichier ? Ou pouvez-vous lire le flux d'entrée/sortie directement à partir de la version compressée .zip ou .tar.gz ? Je suppose que vous auriez besoin de connaître le format du contenu dans le fichier compressé, donc vous devriez probablement le décompresser (je viens de découvrir que ce fichier .tar.gz est en fait un fichier .dat)...

Ensuite, le problème principal est, comment puis-je lire ce gros fichier en Node.js ? Disons que c'est un fichier XML de 1 Go, où devrais-je chercher pour commencer à le parser ? (Non, comment parser du XML, mais si vous lisez le gros fichier ligne par ligne, comment parser quelque chose comme du XML qui a besoin de connaître le contexte des lignes précédentes).

J'ai vu fs.createReadStream, mais j'ai peur de bidouiller avec ça... je ne veux pas faire exploser mon ordinateur. Je cherche juste quelques conseils dans la bonne direction.

9voto

Andrey Sidorov Points 9287

Il existe le module intégré zlib pour la décompression de flux et sax pour l'analyse de flux XML.

var fs = require('fs');
var zlib = require('zlib');
var sax = require('sax');

var saxStream = sax.createStream();
// ajoutez vos gestionnaires XML ici

fs.createReadStream('large.xml.gz').pipe(zlib.createUnzip()).pipe(saxStream);

2voto

Vaibhav Pachauri Points 2621

Nous pouvons également compresser le répertoire quelque chose comme suit :

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('terminé avec succès');
        } else {
                console.log('erreur');
        }
});

Cela a bien fonctionné :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X