2017-05-15 3 views
1

http投稿から大きなファイルを受信して​​います。私はこのファイルから各行を取り出し、それをデータベースに挿入する必要があります。それはそう、これは私が持っているものです時に500かそこらの行を挿入することにより、これを行うにははるかに高速です:ノードストリームby line closeイベント

var readline = require('readline'); 

var insertSize = 500; 
var records = []; 

var reader = readline.createInterface({ 
    input: inputStream 
}); 
reader.on('line', function(line) { 
    reader.pause(); 
    var entry = line.split('\t'); 
    if (entry.length != 3) return reader.resume(); 

    records.push({ 
    first: entry[0], 
    second: entry[1], 
    third: entry[2] 
    }); 

    if (records.length < insertSize) return reader.resume(); 

    database.create(records).exec(function (err) { 
    if (err) return res.serverError(err); 
    records.length = 0; 
    reader.resume(); 
    }); 
}); 
reader.on('error', function(err) { 
    return res.serverError(err); 
}); 
reader.on('close', function() { 
    database.create(records).exec(function (err) { 
    if (err) return res.serverError(err); 
    return res.ok(); 
    }); 
}); 

文書によると、linecloseイベントはまだpause()後にトリガすることができます。これは、lineイベントでdatabase.create()が終了する前に、closeイベントがトリガーされるため発生しています。これを処理するより良い方法はありますか? line-by-lineは良いでしょうが、ストリームを入力として受け取ることはできません。ありがとう。

答えて

0

splitを使用することで、この問題を回避できました。ストリームが一時停止されても、endイベントはトリガーされません。

var split = require('split'); 

var insertSize = 500; 
var records = []; 

readStream.pipe(split()) 
.on('error', function (err) { 
    return res.serverError(err); 
}) 
.on('data', function (line) { 
    var _this = this; 
    this.pause(); 
    var entry = line.split('\t'); 
    if (entry.length != 3) return this.resume(); 
    records.push({ 
    first: entry[0], 
    second: entry[1], 
    third: entry[2] 
    }); 

    if (records.length < insertSize) return this.resume(); 

    database.create(records).exec(function (err) { 
    if (err) return res.serverError(err); 
    records.length = 0; 
    _this.resume(); 
    }); 
}) 
.on('end', function() { 
    database.create(records).exec(function (err) { 
    if (err) return callback(err); 
    return res.ok(); 
    }); 
}); 
関連する問題