「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Node.js ストリームによる効率的なデータ処理

Node.js ストリームによる効率的なデータ処理

2024 年 11 月 9 日に公開
ブラウズ:475

Efficient Data Handling with Node.js Streams

この記事では、Node.js ストリーム について詳しく説明し、大量のデータを効率的に処理するのにどのように役立つかを理解します。ストリームは、大きなファイルの読み取り、ネットワーク経由のデータ転送、リアルタイム情報の処理など、大規模なデータ セットを処理するためのエレガントな方法を提供します。データ全体を一度に読み書きする従来の I/O 操作とは異なり、ストリームはデータを管理可能なチャンクに分割し、部分ごとに処理するため、効率的なメモリ使用が可能になります。

この記事では次の内容を取り上げます:

  1. Node.js ストリームとは何ですか?
  2. Node.js のさまざまな種類のストリーム
  3. ストリームの作成方法と使用方法。
  4. ストリームの実世界の使用例。
  5. ストリームを使用する利点。

Node.js ストリームとは何ですか?

Node.js の

ストリームは、継続的なデータ フローです。ストリームは、ファイルの読み取り、ネットワーク経由の通信、データベースとの対話など、I/O バウンドのタスクを処理する場合に特に役立ちます。オペレーション全体が完了するのを待つ代わりに、ストリームを使用するとデータをチャンク単位で処理できるようになります。

ストリームの主な機能:

  • イベント駆動型: ストリームは Node.js のイベント駆動型アーキテクチャ上に構築されており、データが利用可能になるとすぐに処理できます。
  • メモリ効率: ストリームはデータをチャンクに分割し、部分ごとに処理するため、システムのメモリ負荷が軽減されます。
  • ノンブロッキング: Node.js ストリームは、メイン イベント ループをブロックすることなく、大きなデータを非同期で処理できます。

Node.js のストリームの種類

Node.js は 4 種類のストリームを提供します:

  1. 読み取り可能なストリーム: データを読み取ることができるストリーム。
  2. 書き込み可能なストリーム: データを書き込むことができるストリーム。
  3. 二重ストリーム: 読み取りと書き込みの両方が可能なストリーム (ネットワーク ソケットなど)。
  4. 変換ストリーム: 読み取りまたは書き込み中にデータを変更または変換するストリーム (ファイルの圧縮または解凍など)。

Node.js ストリームの使用

例を挙げて、各タイプのストリームを見てみましょう。

3.1 読み取り可能なストリーム

読み取り可能なストリームを使用すると、データを部分ごとに読み取ることができます。これは、大きなファイルやリアルタイム データ ソースを処理する場合に便利です。


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');
});


  • この例では、createReadStream メソッドはファイルを 16 KB のチャンクで読み取ります。
  • 各チャンクは、ファイル全体がメモリに読み込まれるのを待つのではなく、利用可能になるとすぐに処理されます。
  • 終了イベントは、読み取りプロセスの完了を通知します。

3.2 書き込み可能なストリーム

書き込み可能ストリームは、ファイルやネットワーク ソケットなどの宛先にデータを段階的に書き込むために使用されます。


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 は、データをファイルに増分的に送信します。
  • end 関数は、これ以上データが書き込まれないことを通知し、ストリームを閉じます。

3.3 二重ストリーム

二重ストリームはデータの読み取りと書き込みができます。一般的な例の 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');
});


  • この例では、クライアントから受信データを読み取り、それを送り返す基本的なエコー サーバーを作成します。
  • 二重ストリームは、ネットワーク プロトコルなど、双方向通信が必要な場合に便利です。

3.4 ストリームの変換

変換ストリームは、通過するデータを変更する特別なタイプの二重ストリームです。一般的な使用例はファイル圧縮です。


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');
});


  • パイプ メソッドは、あるストリームから別のストリームにデータ フローを転送するために使用されます。
  • この場合、ファイルは読み取られ、Gzip を使用して圧縮されてから、新しいファイルに書き込まれます。

ストリームの実世界の使用例

4.1 大きなファイルの処理

大きなファイル (ログやメディアなど) を扱う場合、ファイル全体をメモリにロードすると効率が悪く、パフォーマンスの問題が発生する可能性があります。ストリームを使用すると、大きなファイルを段階的に読み書きできるため、メモリの負荷が軽減されます。

例:

  • ユースケース: ビデオまたはオーディオ ファイルをストリーミングするメディア プレーヤー。
  • 解決策: ストリームを使用すると、プレーヤーが一度にロードするデータのチャンクのみが保証され、再生パフォーマンスが向上し、バッファリングが削減されます。

4.2 リアルタイムデータ処理

チャット サーバーやライブ ダッシュボードなどのリアルタイム アプリケーションは、データが到着したときに処理する必要があります。ストリームは、このデータを効率的に処理し、待ち時間を短縮する方法を提供します。

例:

  • ユースケース: 株価監視ダッシュボード。
  • 解決策: ストリームを使用すると、サーバーは受信した株価をリアルタイムで処理し、更新をユーザー インターフェイスにプッシュできます。

4.3 ファイルの圧縮と解凍

圧縮もストリームの一般的な使用例です。ファイル全体をメモリにロードする代わりに、変換ストリームを使用してオンザフライでデータを圧縮できます。

例:

  • ユースケース: 大きなファイルを保存する前に圧縮するバックアップ システム。
  • 解決策: ストリームを使用すると、ファイルを段階的に読み取って圧縮できるため、時間を節約し、メモリ使用量を削減できます。

ストリームを使用する利点

  1. メモリ効率: ストリームはデータのチャンクで動作するため、大きなファイルやデータ セットの処理に必要なメモリが最小限に抑えられます。
  2. パフォーマンスの向上: データを段階的に処理することで、大量の情報の読み込みと処理に必要な時間が短縮されます。
  3. ノンブロッキング I/O: ストリームは Node.js の非同期アーキテクチャを活用し、データの処理中にサーバーが他のタスクを処理できるようにします。
  4. リアルタイム データ処理: ストリームによりリアルタイム通信が可能になり、低遅延のデータ転送を必要とする Web アプリケーションに最適です。
  5. 柔軟性: ストリームは結合、パイプ、変換できるため、複雑なデータ処理パイプラインの強力なツールになります。

結論

Node.js ストリームは、ファイルの読み取り、ネットワーク リクエストの処理、リアルタイム操作の実行など、大量のデータを処理する柔軟かつ効率的な方法を提供します。ストリームを使用すると、データを管理可能なチャンクに分割することで、システムのメモリを圧迫せずに大規模なデータ セットを操作できるようになります。

次の記事では、NGINX と、静的コンテンツの提供、負荷分散、Node.js アプリケーションでのリバース プロキシとしての動作におけるその役割について説明します。セキュリティを強化するために SSL と暗号化を統合する方法についても説明します。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/imsushant12/efficient-data-handling-with-nodejs-streams-4483?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3