2017-04-21 19 views
2

私はノードごとにreadlineというモジュールドキュメントを見て、非常に大きなファイルを1行ずつ読み込んでいます。しかし、私の特別な仕事のために、私はそれを同期して行を読む必要があります。関係なく何を、5行目は、4行目の前に読まれてはならない、とによるノードの性質のために、私はちょうどそれがその使用のために安全で、このコードで確認したい -ファイルストリームを1行ずつ同期して読み込みます。

const readline = require('readline'); 
const fs = require('fs'); 

const rl = readline.createInterface({ 
    input: fs.createReadStream('sample.txt') 
}); 

rl.on('line', (line) => { 
    console.log(`Line from file: ${line}`); 
}); 

ない場合、私は何を使用する必要があります/行う?現在私のために働いていますが、次の行が前の行よりも速く解析できる大きな行で動作するかどうかわかりません。

+0

私は[this](https://repl.it/HTbf/1)を試してみましたが、すべてうまくいきました。最後に同じことを試して、 'var sleep = require( 'sleep');'を使うことができ、 'sleep.msleep(500 * Math.random());'で 'sleep'関数を置き換えてください。おそらく、プログラムの出力を2番目のファイルにパイプし、 'diff'してください。 – Winestone

答えて

1

コールバックが起動する可能性は非常に疑いがあります後で他のものより早く実行することができます。 基本的には、event loopを参照し、プロセスをスタックします。

でも、私はasync/queueと似たようなものを実装することを推奨できますが、コールバックを動的にプッシュすることは可能です。

rl.on('line', (line) => { 
    addLineToQueue(line) 
    console.log(`Added line to queue: ${line}`) 
}) 

そして、あなたのキューの実装は限りそれが実行するすべてのタスクを持っているとして起動する必要があります確認してください:あなたは、あなたのコードを変更します

const Queue = require('./my-queue') 
const queue = new Queue() 

function addLineToQueue(line) { 
    queue.push(function() { 
    // do some job with line 
    console.log(`Line: "${line}" was successfully processed!`) 
    }) 
} 

:あなたはこのような何かを持っているだろうと仮定

。このようにコールバックの順序が保証されます。しかし、私にとっては少しオーバーヘッドのように見えます。

+1

しかし、行4が行3よりも前に抽出された場合、その順序は依然としてキュー内で '1 2 4 3'になります。 –

+0

不可能ではありませんが、ラインは1つずつ直接抽出されます。シャッフルできる唯一の方法は、非常に長い同期コールバック実行と次の回線ポンピングです。これをキューに入れることをお勧めします。内部のキューインプリメンテーションでは、子プロセスでタスクを起動できるため、瞬時にシャッフルすることはありません。 – Lazyexpert

関連する問題