In diesem Artikel werden wir tief in die Node.js-Streams eintauchen und verstehen, wie sie bei der effizienten Verarbeitung großer Datenmengen helfen. Streams bieten eine elegante Möglichkeit, große Datenmengen zu verarbeiten, z. B. große Dateien zu lesen, Daten über das Netzwerk zu übertragen oder Echtzeitinformationen zu verarbeiten. Im Gegensatz zu herkömmlichen E/A-Vorgängen, bei denen die gesamten Daten auf einmal gelesen oder geschrieben werden, unterteilen Streams die Daten in überschaubare Blöcke und verarbeiten sie Stück für Stück, was eine effiziente Speichernutzung ermöglicht.
In diesem Artikel werden wir Folgendes behandeln:
Ein Stream in Node.js ist ein kontinuierlicher Datenfluss. Streams sind besonders nützlich für die Bearbeitung von I/O-gebundenen Aufgaben, wie etwa dem Lesen von Dateien, der Kommunikation über ein Netzwerk oder der Interaktion mit Datenbanken. Anstatt auf den Abschluss eines gesamten Vorgangs zu warten, ermöglichen Streams die Verarbeitung von Daten in Blöcken.
Node.js bietet vier Arten von Streams:
Lassen Sie uns jeden Stream-Typ anhand von Beispielen untersuchen.
Lesbare Streams ermöglichen es Ihnen, Daten Stück für Stück zu lesen, was für die Verarbeitung großer Dateien oder Echtzeit-Datenquellen nützlich ist.
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'); });
Schreibbare Streams werden verwendet, um Daten inkrementell an ein Ziel zu schreiben, beispielsweise eine Datei oder einen Netzwerk-Socket.
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'); });
Ein Duplex-Stream kann Daten lesen und schreiben. Ein häufiges Beispiel ist ein TCP-Socket, der gleichzeitig Daten senden und empfangen kann.
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'); });
Ein Transformations-Stream ist eine spezielle Art von Duplex-Stream, der die Daten beim Durchgang ändert. Ein häufiger Anwendungsfall ist die Dateikomprimierung.
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'); });
Beim Umgang mit großen Dateien (z. B. Protokollen oder Medien) ist das Laden der gesamten Datei in den Speicher ineffizient und kann zu Leistungsproblemen führen. Mit Streams können Sie große Dateien inkrementell lesen oder schreiben und so die Speicherbelastung reduzieren.
Beispiel:
Echtzeitanwendungen wie Chat-Server oder Live-Dashboards müssen Daten verarbeiten, sobald sie ankommen. Streams bieten eine Möglichkeit, diese Daten effizient zu verarbeiten und die Latenz zu reduzieren.
Beispiel:
Komprimierung ist ein weiterer häufiger Anwendungsfall für Streams. Anstatt die gesamte Datei in den Speicher zu laden, können Sie Daten mithilfe von Transformationsströmen im laufenden Betrieb komprimieren.
Beispiel:
Node.js-Streams bieten eine flexible und effiziente Möglichkeit, große Datenmengen zu verarbeiten, unabhängig davon, ob Sie Dateien lesen, Netzwerkanforderungen verarbeiten oder Echtzeitvorgänge ausführen. Durch die Aufteilung der Daten in überschaubare Blöcke ermöglichen Streams die Arbeit mit großen Datenmengen, ohne den Systemspeicher zu überlasten.
Im nächsten Artikel werden wir NGINX und seine Rolle bei der Bereitstellung statischer Inhalte, dem Lastausgleich und der Arbeit als Reverse-Proxy in Node.js-Anwendungen untersuchen. Wir besprechen auch, wie man SSL und Verschlüsselung für mehr Sicherheit integriert.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3