JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

Node.jsのストリーム:writable.writableLengthプロパティの使い方

writable.writableLength プロパティは、書き込み待ちのキューに蓄積されているバイト数(またはオブジェクト数)を取得するために使用されます。この値を highWaterMark(バッファのしきい値)と照らし合わせることで、ストリームにどれほどのデータが溜まっているかを把握し、データの状態を検査することができます。


構文

writable.writableLength

例1:cork()を使った基本例

まず「writableLength.js」という名前のファイルを作成し、以下のコードをコピーしてください。ファイル作成後、次のコマンドでコードを実行します。

node writableLength.js
// writable.writableLength プロパティのデモンストレーションプログラム
const stream = require('stream');

// 書き込み可能な(Writable)データストリームを作成
const writable = new stream.Writable({
  // ストリームからデータを書き込む
  write: function(chunk, encoding, next) {
    // 表示できるようにデータチャンクを文字列に変換
    console.log(chunk.toString());
    next();
  }
});

// データを書き込み(この時点ではバッファキューに入っていない)
writable.write('Hi - This data will not be counted');

// cork() 関数を呼び出して書き込みを一時停止
writable.cork();

// 再度データを書き込む
writable.write('Welcome to TutorialsPoint !');
writable.write('SIMPLY LEARNING ');
writable.write('This data will be corked in the memory');

// キュー内のデータ量を出力
console.log(writable.writableLength);

出力結果

C:\home\node>> node writableLength.js
Hi - This data will not be counted
81

この例では、最初に書き込んだ「Hi – …」のデータは cork() の呼び出し前にすでに処理されているため、カウントの対象になりません。一方、cork() 以降に書き込まれた3つのデータはバッファキューに保持され、その合計サイズ(81バイト)が writableLength としてコンソールに出力されます。


例2:uncork()と組み合わせた例

続いて、uncork() を使ってバッファを解放した場合の挙動を確認してみましょう。

// writable.cork() メソッドのデモンストレーションプログラム
const stream = require('stream');

// 書き込み可能な(Writable)データストリームを作成
const writable = new stream.Writable({
  // ストリームからデータを書き込む
  write: function(chunk, encoding, next) {
    // 表示できるようにデータチャンクを文字列に変換
    console.log(chunk.toString());
    next();
  }
});

// データを書き込み(この時点ではバッファキューに入っていない)
writable.write('Hi - This data will not be counted');

// cork() 関数を呼び出して書き込みを一時停止
writable.cork();

// 再度データを書き込む
writable.write('Welcome to TutorialsPoint !');
writable.write('SIMPLY LEARNING ');
writable.write('This data will be corked in the memory');

// キュー内のデータ量を出力
console.log(writable.writableLength);

// バッファリングされたメモリからデータをフラッシュ
writable.uncork()

console.log(writable.writableLength);

出力結果

C:\home\node>> node writableLength.js
Hi - This data will not be counted
81
Welcome to TutorialsPoint !
SIMPLY LEARNING
This data will be corked in the memory
0

uncork() を呼び出すと、それまでバッファに溜められていたデータがすべてフラッシュ(実際に書き出し)されます。その結果、キューには何も残らなくなるため、最後に出力される writableLength の値は 0 になります。


ポイントまとめ

  • writableLength は、書き込み待ちのキューに蓄積されたデータ量(バイト数またはオブジェクト数)を返します。
  • highWaterMark の値と比較することで、ストリームのバッファ状態を監視・診断するのに役立ちます。
  • cork() 中に書き込まれたデータはキューに蓄積され、writableLength の値が増加していきます。
  • uncork() でデータをフラッシュするとキューが空になり、writableLength は 0 に戻ります。
  1. データ構造入門:圧縮四分木と八分木(Octree)の基礎と活用法

    圧縮四分木(Compressed Quadtree)とは四分木では、分割されたセルごとにノードを保存していくため、データを持たない空のノードが大量に発生しがちです。こうした疎なツリーのサイズを抑えるには、意味のあるデータを保持する葉を持つ部分木、いわゆる「重要な部分木」だけを保存すれば十分です。さらにサイズを削減することも可能です。重要な部分木だけを扱う場合、枝刈りの過程で、中間ノードの次数が2(親へのリンク1つと子へのリンク1つのみ)であるような長いパスを取り除けます。実際には、そのパスの始点にあるノードUだけを保存し(削除したノード群を表すメタデータをUに関連付けておき)、パスの終点を根と

  2. 二分探索木の走査アルゴリズム完全解説:行順・先行順・後行順・レベル順をC++で実装

    二分探索木の走査とはこの記事では、二分探索木(BST:Binary Search Tree)に格納されたキーを巡回するための4種類の走査アルゴリズムを解説します。具体的には、以下の4つです。行順(Inorder)走査:左部分木 → 根 → 右部分木の順に訪問先行順(Preorder)走査:根 → 左部分木 → 右部分木の順に訪問後行順(Postorder)走査:左部分木 → 右部分木 → 根の順に訪問レベル順(Level-order)走査:木の上から階層ごとに左から右へ訪問例として使用する木説明のために、次のような二分探索木を想定します。この木に対する各走査の結果は以下のようになります。行順走