この記事では、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'); });
大きなファイル (ログやメディアなど) を扱う場合、ファイル全体をメモリにロードすると効率が悪く、パフォーマンスの問題が発生する可能性があります。ストリームを使用すると、大きなファイルを段階的に読み書きできるため、メモリの負荷が軽減されます。
例:
チャット サーバーやライブ ダッシュボードなどのリアルタイム アプリケーションは、データが到着したときに処理する必要があります。ストリームは、このデータを効率的に処理し、待ち時間を短縮する方法を提供します。
例:
圧縮もストリームの一般的な使用例です。ファイル全体をメモリにロードする代わりに、変換ストリームを使用してオンザフライでデータを圧縮できます。
例:
Node.js ストリームは、ファイルの読み取り、ネットワーク リクエストの処理、リアルタイム操作の実行など、大量のデータを処理する柔軟かつ効率的な方法を提供します。ストリームを使用すると、データを管理可能なチャンクに分割することで、システムのメモリを圧迫せずに大規模なデータ セットを操作できるようになります。
次の記事では、NGINX と、静的コンテンツの提供、負荷分散、Node.js アプリケーションでのリバース プロキシとしての動作におけるその役割について説明します。セキュリティを強化するために SSL と暗号化を統合する方法についても説明します。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3