Node.jsストリームAPIを使用しない方法

再びインターネット上で誰かが間違っています-昨日Node Weeklyで、著者がNode.jsでStream APIのパフォーマンスを測定および比較しようとしている投稿へのリンクがありました。 悲しみは、著者がストリームをどのように扱うか、そしてこれに基づいて彼がどのような結論を下そうとしているのかを引き起こします:







...これは小さなファイルでもかなりうまくいきましたが、最大のファイルに到達すると同じエラーが発生しました。 Node.jsは入力と出力をストリーミングしていましたが、操作の実行中にファイル全体をメモリに保持しようとしました

著者の結論とコードの何が悪いのかを考えてみましょう。







私の観点から見ると、問題は記事の著者がStream'amiの使い方を知らないことであり、これは非常に頻繁に対処しなければならない問題です。 私の意見では、この現象には3つの理由があります。







  1. Node.jsストリームAPIの複雑なストーリー- ここで説明する痛みと苦しみ
  2. ラッパーなしで使用しようとすると、最も直感的なAPIではありません
  3. ストリームを非常に複雑で低レベルなものとして提示するかなり奇妙なドキュメント


まとめると、これは開発者がStream APIを使用する方法を知らず、使用したくないという事実につながります。







著者コードの何が問題になっていますか?

まず、ここでタスクを繰り返しましょう(英語のオリジナルとファイルへのリンクは投稿にあります):

次の形式の行を持つ特定の2.5 GBファイルがあります。







C00084871|N|M3|P|201703099050762757|15|IND|COLLINS, DARREN ROBERT|SOUTHLAKE|TX|760928782|CELANESE|VPCHOP&TECH|02282017|153||PR2552193345215|1151824||P/R DEDUCTION ($76.92 BI-WEEKLY)|4030920171380058715
      
      





それを解析して、次の情報を見つける必要があります。









問題は何ですか? -作成者は、ファイル全体をメモリにロードすると正直に言います。そのため、ノードは「ハング」し、興味深い事実を示してくれます。







楽しい事実:Node.jsは、一度に最大1.67GBのメモリしか保持できません

著者は、この事実から奇妙な結論を下し、ファイル全体をメモリにロードするのはストリームであり、間違ったコードを書いていないということです。

論文を反証しましょう:「 Node.jsは入力と出力をストリーミングしていましたが、ファイルの行数を数える小さなプログラムを書くことで、 ファイル全体を保持しようとしています。







 const { Writable } = require('stream') const fs = require('fs') const split = require('split') let counter = 0 const linecounter = new Writable({ write(chunk, encoding, callback) { counter = counter + 1 callback() }, writev(chunks, callback) { counter = counter + chunks.length callback() } }) fs.createReadStream('itcont.txt') .pipe(split()) .pipe(linecounter) linecounter.on('finish', function() { console.log(counter) })
      
      





NB :コードは意図的に可能な限り単純に書かれています。 グローバル変数は悪いです!







次のことに注意してください。









それでは、大きなファイルで作成をテストしてみましょう。







 > node linecounter.js 13903993
      
      





あなたが見ることができるように-すべてが動作します。 このことから、Stream APIはあらゆるサイズのファイルで優れた仕事をしており、投稿の著者の声明は控えめに言っても真実ではないと結論付けることができます。 ほぼ同じ方法で、問題に必要な他の値を計算できます。







伝える:










All Articles