"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Gestion efficace des données avec les flux Node.js

Gestion efficace des données avec les flux Node.js

Publié le 2024-11-09
Parcourir:285

Efficient Data Handling with Node.js Streams

Dans cet article, nous allons approfondir les Node.js Streams et comprendre comment ils aident à traiter efficacement de grandes quantités de données. Les flux constituent un moyen élégant de gérer des ensembles de données volumineux, tels que la lecture de fichiers volumineux, le transfert de données sur le réseau ou le traitement d'informations en temps réel. Contrairement aux opérations d'E/S traditionnelles qui lisent ou écrivent l'intégralité des données en même temps, les flux divisent les données en morceaux gérables et les traitent pièce par pièce, permettant une utilisation efficace de la mémoire.

Dans cet article, nous aborderons :

  1. Que sont les flux Node.js ?
  2. Différents types de flux dans Node.js.
  3. Comment créer et utiliser des flux.
  4. Cas d'utilisation réels des flux.
  5. Avantages de l'utilisation des flux.

Que sont les flux Node.js ?

Un flux dans Node.js est un flux continu de données. Les flux sont particulièrement utiles pour gérer les tâches liées aux E/S, telles que la lecture de fichiers, la communication sur un réseau ou l'interaction avec des bases de données. Au lieu d'attendre la fin d'une opération complète, les flux permettent de traiter les données par morceaux.

Principales caractéristiques des flux :

  • Event-Driven : les flux sont construits sur l'architecture événementielle de Node.js, qui permet de traiter les données dès qu'elles sont disponibles.
  • Mémoire efficace : les flux divisent les données en morceaux et les traitent pièce par pièce, réduisant ainsi la charge de mémoire sur votre système.
  • Non bloquant : les flux Node.js peuvent gérer des données volumineuses de manière asynchrone sans bloquer la boucle d'événements principale.

Types de flux dans Node.js

Node.js propose quatre types de flux :

  1. Flux lisibles : flux à partir desquels vous pouvez lire des données.
  2. Flux inscriptibles : flux dans lesquels vous pouvez écrire des données.
  3. Flux duplex : flux à la fois lisibles et inscriptibles (par exemple, les sockets réseau).
  4. Flux de transformation : flux qui modifient ou transforment les données lors de la lecture ou de l'écriture (par exemple, compression ou décompression de fichiers).

Utiliser les flux Node.js

Explorons chaque type de flux avec des exemples.

3.1 Flux lisibles

Les

Les flux lisibles vous permettent de lire les données pièce par pièce, ce qui est utile pour gérer des fichiers volumineux ou des sources de données en temps réel.


const fs = require('fs');

// Create a readable stream from a large file
const readableStream = fs.createReadStream('largeFile.txt', {
    encoding: 'utf8',
    highWaterMark: 16 * 1024 // 16 KB chunk size
});

readableStream.on('data', (chunk) => {
    console.log('New chunk received:', chunk);
});

readableStream.on('end', () => {
    console.log('Reading file completed');
});


  • Dans cet exemple, la méthode createReadStream lit le fichier par morceaux de 16 Ko.
  • Chaque morceau est traité dès qu'il devient disponible, plutôt que d'attendre que l'intégralité du fichier soit chargée en mémoire.
  • L'événement de fin signale la fin du processus de lecture.

3.2 Flux inscriptibles

Les flux inscriptibles sont utilisés pour écrire des données de manière incrémentielle vers une destination, telle qu'un fichier ou une socket réseau.


const fs = require('fs');

// Create a writable stream to write data to a file
const writableStream = fs.createWriteStream('output.txt');

writableStream.write('Hello, world!\n');
writableStream.write('Writing data chunk by chunk.\n');

// End the stream and close the file
writableStream.end(() => {
    console.log('File writing completed');
});


  • write envoie les données au fichier de manière incrémentielle.
  • La fonction de fin signale qu'aucune donnée ne sera écrite et ferme le flux.

3.3 Flux duplex

Un flux duplex peut lire et écrire des données. Un exemple courant est un socket TCP, qui peut envoyer et recevoir des données simultanément.


const net = require('net');

// Create a duplex stream (a simple echo server)
const server = net.createServer((socket) => {
    socket.on('data', (data) => {
        console.log('Received:', data.toString());
        // Echo the data back to the client
        socket.write(`Echo: ${data}`);
    });

    socket.on('end', () => {
        console.log('Connection closed');
    });
});

server.listen(8080, () => {
    console.log('Server listening on port 8080');
});


  • Cet exemple crée un serveur d'écho de base qui lit les données entrantes du client et les renvoie.
  • Les flux duplex sont pratiques lorsqu'une communication bidirectionnelle est nécessaire, comme dans les protocoles réseau.

3.4 Transformer les flux

Un flux de transformation est un type spécial de flux duplex qui modifie les données lors de leur passage. Un cas d'utilisation courant est la compression de fichiers.


const fs = require('fs');
const zlib = require('zlib');

// Create a readable stream for a file and a writable stream for the output file
const readable = fs.createReadStream('input.txt');
const writable = fs.createWriteStream('input.txt.gz');

// Create a transform stream that compresses the file
const gzip = zlib.createGzip();

// Pipe the readable stream into the transform stream, then into the writable stream
readable.pipe(gzip).pipe(writable);

writable.on('finish', () => {
    console.log('File successfully compressed');
});


  • La méthode pipe est utilisée pour diriger le flux de données d'un flux à un autre.
  • Dans ce cas, le fichier est lu, compressé à l'aide de Gzip, puis écrit dans un nouveau fichier.

Cas d'utilisation réels des flux

4.1 Gestion des fichiers volumineux

Lorsque vous traitez des fichiers volumineux (par exemple, des journaux ou des médias), le chargement de l'intégralité du fichier en mémoire est inefficace et peut entraîner des problèmes de performances. Les flux vous permettent de lire ou d'écrire des fichiers volumineux de manière incrémentielle, réduisant ainsi la charge sur la mémoire.

Exemple:

  • Cas d'utilisation : un lecteur multimédia qui diffuse des fichiers vidéo ou audio.
  • Solution : L'utilisation de flux garantit que le lecteur ne charge que des morceaux de données à la fois, améliorant ainsi les performances de lecture et réduisant la mise en mémoire tampon.

4.2 Traitement des données en temps réel

Les applications en temps réel telles que les serveurs de chat ou les tableaux de bord en direct doivent traiter les données dès leur arrivée. Les flux fournissent un moyen de gérer ces données efficacement, réduisant ainsi la latence.

Exemple:

  • Cas d'utilisation : Un tableau de bord de suivi du cours des actions.
  • Solution : les flux permettent au serveur de traiter les cours des actions entrants en temps réel et d'envoyer des mises à jour à l'interface utilisateur.

4.3 Compression et décompression de fichiers

La compression est un autre cas d'utilisation courant pour les flux. Au lieu de charger l'intégralité du fichier en mémoire, vous pouvez compresser les données à la volée à l'aide de flux de transformation.

Exemple:

  • Cas d'utilisation : systèmes de sauvegarde qui compressent les fichiers volumineux avant de les enregistrer.
  • Solution : Les flux permettent de lire et de compresser les fichiers de manière incrémentielle, ce qui permet de gagner du temps et de réduire l'empreinte mémoire.

Avantages de l'utilisation des flux

  1. Efficacité de la mémoire : les flux fonctionnent sur des morceaux de données, ce qui minimise la mémoire requise pour traiter des fichiers ou des ensembles de données volumineux.
  2. Performances améliorées : le traitement des données réduit progressivement le temps nécessaire au chargement et au traitement de grandes quantités d'informations.
  3. E/S non bloquantes : les flux exploitent l'architecture asynchrone de Node.js, permettant au serveur de gérer d'autres tâches pendant le traitement des données.
  4. Traitement des données en temps réel : les flux permettent une communication en temps réel, idéal pour les applications Web qui nécessitent un transfert de données à faible latence.
  5. Flexibilité : les flux peuvent être combinés, redirigés et transformés, ce qui en fait un outil puissant pour les pipelines de traitement de données complexes.

Conclusion

Les flux Node.js offrent un moyen flexible et efficace de gérer de grandes quantités de données, que vous lisiez des fichiers, traitiez des requêtes réseau ou effectuiez des opérations en temps réel. En décomposant les données en morceaux gérables, les flux vous permettent de travailler avec de grands ensembles de données sans surcharger la mémoire du système.

Dans le prochain article, nous explorerons NGINX et son rôle dans la diffusion de contenu statique, l'équilibrage de charge et le travail en tant que proxy inverse dans les applications Node.js. Nous verrons également comment intégrer SSL et le cryptage pour une sécurité renforcée.

Déclaration de sortie Cet article est reproduit sur : https://dev.to/imsushant12/efficient-data-handling-with-nodejs-streams-4483?1 En cas d'infraction, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3