2017-02-16 25 views
0

nodejsに並行性の問題があるように見えます。私はこれが可能ではないという事実を認識しています。Nodejs filestream concurrency

ファイルの行でデータを処理していて、それを別のファイルに行単位で書き出しています。出力ファイルでは、行が上書きされていることに気付きました。そのたびに、出力の行が他の行の半分上書きされているように見えます。 読み込みストリームからデータを読みます。

let iStream = fs.createReadStream(inputFile); 
let oStream = fs.createWriteStream(outputFile); 
let remaining = ''; 

iStream.on('data',(data)=>{ 
    remaining += data; 
    let line = remaining.split(/\r?\n/); 
    let lines = line.length; 
    if(lines > 0) { 
    remaining = line[lines - 1]; 
    line.length = lines - 1; 
    line.forEach((curr)=>{ 
     oStream.write(processLine(curr)); 
    }); 
}); 

このスキームで書き込み障害が発生する可能性はありますか、それとも別の場所を見なければなりませんか?

+0

'processLine()'とは何ですか?それは完全に同期ですか?参考までに、あなたは 'remaining = line.pop()'でコードを単純化することができます。 – jfriend00

+0

また、 '.write()'は出力バッファがいっぱいで、 'drain'イベントが再び書き込みを開始するのを待たなければならないことを示すブール値を返します。 [the doc](https://nodejs.org/api/stream.html#stream_writable_write_chunk_encoding_callback)を参照してください。 – jfriend00

+0

[トランスフォームストリーム](http://codewinds.com/blog/2013-08-20-nodejs-transform-streams.html)を使い、 '.pipe()'を使ってあなたのためのフロー制御。 – jfriend00

答えて

1

これはバッファオーバーフローの問題のようです。書き込みバッファがオーバーフローしている可能性がありますが、フロー制御には注意を払っていません。

あなたは.write()にコールバックを渡して、そのコールバックが呼び出されたり、.write()からの戻り値に注意を払うことができ、それがfalseを返すとき、あなたはその後、drainイベントを待つ必要がある場合にのみ、次の書き込みを続行しますか、ストリームでもう少し書く前に。

もう1つの方法は、transform streamと入力してから.pipe()を使用し、ストリーミングインフラストラクチャによってフロー制御が管理されるようにすることです。

+0

トランスフォーマーは魅力的で、ソースコードが少ないように動作します..ありがとう。 – Thomas