NPMライブラリ:through高速双方向ストリームの作成
1800 ワード
NPMライブラリは、毎日2分、人気のあるNPMライブラリを知っています.
ながれ
ダウンロードなどの機能をするとき、私たちはよくデータストリームモジュール(stream)を使用します.なぜなら、大きなファイルダウンロードシーンでは、
streamを使用すると、ファイルをすべてメモリに読み込むのではなく、メモリに「水道管」を構築するだけなので、メモリにデータがあまり蓄積されません.
上記のコードでは、
にほうこうりゅう
1つのストリームが同時に読み取り可能で書き込み可能である場合、これは双方向のストリームです.「水道管」は双方向の流れを説明するのに適していません.私たちは「電話線」で説明します.あなたの言うこと(データを書く)は相手が聞こえる(データを読む)と同時に、相手の話(データを書く)も聞こえます(データを読む).
双方向ストリームを使用すると、データベースがシーンをエクスポートするなど、複雑な問題を解決することが多い.データベースのデータが大きいので、ノードを一気に読むことはできません.jsメモリでは、書き込み専用ストリームを作成し、データベースからデータを1つずつ読み出して書き込み専用ストリームを呼び出し、データをディスクに書き込み、すべてのデータをディスクにエクスポートした後、上記を参照して読み取り専用ストリームを作成し、クライアントにファイルを返すことができます.しかし、このように問題があります.ディスクサイズには が必要です.データベースがディスクにエクスポートされる間、クライアントは情報を受け取ることができず、ブラウザが にタイムアウトする可能性があります.システム性能を無駄に消費し、ディスクIO を浪費する
次に、双方向ストリームを使用してこの問題を解決します.
through
throughを使用すると、streamモジュールを呼び出して双方向ストリームを作成するよりも、throughがリソース回収などのメカニズムをカプセル化しているため、双方向ストリームを迅速に作成できます.
上記のコードでは、まず双方向ストリームを作成し、Koaに返し、Mongooseモデルで例を挙げてデータベースをクエリーし、クエリーカーソル(cursor)を使用してストリームにデータを1つずつ書きます.ストリームの反対側では、Koaはデータを1つずつ読み出してクライアントに返すことができます.
参考資料
https://github.com/dominictar...
https://nodejs.org/api/stream...
公衆番号へようこそ:梁興臣
毎日1つのNPMライブラリを知っていて、1年後にノードになります.jsの達人
ながれ
ダウンロードなどの機能をするとき、私たちはよくデータストリームモジュール(stream)を使用します.なぜなら、大きなファイルダウンロードシーンでは、
fs.readFile()
インタフェースを使用してファイルをすべてメモリに読み込み、クライアントに返すと、ファイル200 Mのようなメモリを爆発させやすく、同時に100人がダウンロードしている場合、サービスは10 Gメモリを消費する必要があります.streamを使用すると、ファイルをすべてメモリに読み込むのではなく、メモリに「水道管」を構築するだけなので、メモリにデータがあまり蓄積されません.
ctx.body = fs.createReadStream('filename.ext');
上記のコードでは、
fs.createReadStream()
メソッドを使用して読み取り可能なストリームを作成し、Koaはデータストリームを直接読み取り、クライアントに返します.にほうこうりゅう
1つのストリームが同時に読み取り可能で書き込み可能である場合、これは双方向のストリームです.「水道管」は双方向の流れを説明するのに適していません.私たちは「電話線」で説明します.あなたの言うこと(データを書く)は相手が聞こえる(データを読む)と同時に、相手の話(データを書く)も聞こえます(データを読む).
双方向ストリームを使用すると、データベースがシーンをエクスポートするなど、複雑な問題を解決することが多い.データベースのデータが大きいので、ノードを一気に読むことはできません.jsメモリでは、書き込み専用ストリームを作成し、データベースからデータを1つずつ読み出して書き込み専用ストリームを呼び出し、データをディスクに書き込み、すべてのデータをディスクにエクスポートした後、上記を参照して読み取り専用ストリームを作成し、クライアントにファイルを返すことができます.しかし、このように問題があります.
次に、双方向ストリームを使用してこの問題を解決します.
through
throughを使用すると、streamモジュールを呼び出して双方向ストリームを作成するよりも、throughがリソース回収などのメカニズムをカプセル化しているため、双方向ストリームを迅速に作成できます.
const through = require('through');
// ...
const stream = through();
ctx.body = stream;
Order.find()
.cursor()
.eachAsync(async(order)=>{
stream.write(order.toJSON());
})
.then(()=>{
stream.end();
});
上記のコードでは、まず双方向ストリームを作成し、Koaに返し、Mongooseモデルで例を挙げてデータベースをクエリーし、クエリーカーソル(cursor)を使用してストリームにデータを1つずつ書きます.ストリームの反対側では、Koaはデータを1つずつ読み出してクライアントに返すことができます.
参考資料
https://github.com/dominictar...
https://nodejs.org/api/stream...
公衆番号へようこそ:梁興臣
毎日1つのNPMライブラリを知っていて、1年後にノードになります.jsの達人