ホームページ >ウェブフロントエンド >jsチュートリアル >Node.js ストリームによる効率的なデータ処理
この記事では、Node.js ストリーム について詳しく説明し、それらが大量のデータを効率的に処理するのにどのように役立つかを理解します。ストリームは、大きなファイルの読み取り、ネットワーク経由のデータ転送、リアルタイム情報の処理など、大規模なデータ セットを処理するためのエレガントな方法を提供します。データ全体を一度に読み書きする従来の I/O 操作とは異なり、ストリームはデータを管理可能なチャンクに分割し、部分ごとに処理するため、効率的なメモリ使用が可能になります。
この記事では以下について説明します:
ストリーム は、継続的なデータ フローです。ストリームは、ファイルの読み取り、ネットワーク経由の通信、データベースとの対話など、I/O バウンドのタスクを処理する場合に特に役立ちます。オペレーション全体が完了するのを待つ代わりに、ストリームを使用するとデータをチャンク単位で処理できます。
Node.js は 4 種類のストリームを提供します。
例を挙げて、各タイプのストリームを見てみましょう。
読み取り可能なストリーム を使用すると、データを部分ごとに読み取ることができます。これは、大きなファイルやリアルタイム データ ソースを処理する場合に便利です。
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'); });
書き込み可能ストリームは、ファイルやネットワーク ソケットなどの宛先にデータを段階的に書き込むために使用されます。
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'); });
二重ストリームはデータの読み取りと書き込みができます。一般的な例の 1 つは、データを同時に送受信できる TCP ソケットです。
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'); });
変換ストリームは、通過するデータを変更する特別なタイプの二重ストリームです。一般的な使用例はファイル圧縮です。
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 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 :
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 discuterons également de la façon d’intégrer SSL et le cryptage pour une sécurité renforcée.
以上がNode.js ストリームによる効率的なデータ処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。