2017-03-07 20 views
4

私はwebsocketからデータを受け取っています。バイナリデータを20ms単位で送信します。それが入って来てバックエンドプロセスは、連続ストリームとしてデータを読み取ることができるように、私はこれらのチャンクのそれぞれを連結する必要があります。今のところノード内の同じファイルに非同期で書き込みして読み込む方法は?

//Create the file and append binary as it comes in 

    tmp.file({postfix: '.raw' },function (err, path, fd, cleanup) { 
    if (err) throw err; 
    newPath = path 
     fs.appendFile(newPath, new Buffer(binary), (err) => { 
      if (err) throw err; 

     }) 
    }) 

//Read the file as it is written 
    fs.createReadStream(newPath).pipe(recStream); 

私はただそこにあることを確認するcreateReadStreamに簡単な半秒の遅延を持っていますファイル内のデータ。

これは間違いなく、正しく動作していないと思われます。これについて正しい方法は何ですか?

+1

なぜファイルに書き込んだのですか?もう一度読み込みますか?データを他のプロセスに直接送信することもできます。 – SpiderPig

+0

それは20msに分割されているので、それを送信するAPIは、チャンクが送信されるたびにアップロードが終了したことを通知します。 –

+1

ノードjsでデュプレックスストリームを使用http://codewinds.com/blog/2013-08-31-nodejs-duplex-streams.html –

答えて

2

この状況で最も良いことは、データを受信して​​いるサーバーに、処理する準備が整うまで(drain)と言うことです。それがあなたのためのオプションではないと仮定してください:

まず、着信ストリームを宛先ストリームに書き込んでください。 write(chunk)falseを返す場合、これはストリームの内部バッファがいっぱいであることを意味します。それ以降のデータをディスクにバッファリングする時間です。 (chunkあなただけバッファされfalse戻り値が得られ書いた。それをディスクに書き込みません - それはバッファがhighWaterMark以上のデータを持っていることだけで、信号の書き込みが失敗したという意味ではありませんfalse

テンポラリフォルダ内に、新しいファイル(A)を作成し、次のチャンクを書き込みます。宛先ストリームがdrainイベントを送信するまでこれを行います。

あなたの目的地drain S:

  1. は、バッファファイルをスワップアウト。現在のバッファーファイルAを閉じ、新しい一時ファイルBを作成して、新しい受信データの書き込みを開始します。
  2. テンポラリファイルAで読み取りストリームを開き、そこから目的のストリームにパイプデータを開始します。おそらく実際のpipe()メソッドを使用することはできません。これは、すべての着信データの実際の終了ではないため、一時ファイルの最後に到達したときにデータの終わりを知らせるためです。 (Look at what pipe() doesをし、自分自身、マイナスはend()を呼び出すことを実装しています。)一時ファイルのストリームendを発するとき
  3. は、ファイルを削除します。次にステップ1に戻り、ファイルBでプロセスを再開します。 (データはその間にBをファイルに書き込まれなかった場合は、先のストリームに直接入ってくるデータを書き込む、バックバッファなしの動作に戻ります。)それはデータを送信して行われているサーバーの信号一度

すべてのデータはテンポラリファイルから読み取られ、write(null)が宛先ストリームに追加され、それ以上データが存在しないことを通知します。すべて完了!

一時バッファファイル間をスワップし、データが処理された後で削除することで、ファイルに書き込まれる際にデータを読み込む心配がありません。さらに、着信データストリーム全体をディスクにバッファリングする必要はありません。

もちろん、これは、記憶媒体がネットワーク経由でデータを受け取るよりも速く書き込みを受け入れることが保証されていることを前提にしています。これはおそらく安全ですが、この仮定が間違っていると事態が悪化する可能性があります。このを実動システムを使用してテストしてください - ピーク入力データレートはどれくらいですか?

関連する問題