Nodejs读取非常大的文件(~10GB),逐行处理然后写入其他文件

HVT*_*VT7 7 file-io file-handling file-processing large-files node.js

我有一个特定格式的10 GB日志文件,我想逐行处理该文件,然后在应用一些转换后将输出写入其他文件。我正在使用节点来执行此操作。

虽然这个方法很好,但是需要花费很多时间。在 JAVA 中,我能够在 30-45 分钟内完成此操作,但在 Node 中,完成同样的工作需要 160 多分钟。以下是代码:

以下是从输入中读取每一行的启动代码。

var path = '../10GB_input_file.txt';
var output_file = '../output.txt';

function fileopsmain(){

    fs.exists(output_file, function(exists){
        if(exists) {
            fs.unlink(output_file, function (err) {
                if (err) throw err;
                console.log('successfully deleted ' + output_file);
            });
        }
    });

    new lazy(fs.createReadStream(path, {bufferSize: 128 * 4096}))
        .lines
        .forEach(function(line){
            var line_arr = line.toString().split(';');
            perform_line_ops(line_arr, line_arr[6], line_arr[7], line_arr[10]);
        }
    );

}
Run Code Online (Sandbox Code Playgroud)

这是对该行执行某些操作并将输入传递给 write 方法以将其写入输出文件的方法。

function perform_line_ops(line_arr, range_start, range_end, daynums){

    var _new_lines = '';
    for(var i=0; i<days; i++){
        //perform some operation to modify line pass it to print
    }

    write_line_ops(_new_lines);
}
Run Code Online (Sandbox Code Playgroud)

以下方法用于将数据写入新文件。

function write_line_ops(line) {
    if(line != null && line != ''){
        fs.appendFileSync(output_file, line);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想把这个时间缩短到 15-20 分钟。是否可以这样做呢。

另外,为了记录,我正在具有8 GB RAM 的 intel i7 处理器上尝试此操作。

msc*_*dex 6

您无需模块即可轻松完成此操作。例如:

var fs = require('fs');
var inspect = require('util').inspect;

var buffer = '';
var rs = fs.createReadStream('foo.log');
rs.on('data', function(chunk) {
  var lines = (buffer + chunk).split(/\r?\n/g);
  buffer = lines.pop();
  for (var i = 0; i < lines.length; ++i) {
    // do something with `lines[i]`
    console.log('found line: ' + inspect(lines[i]));
  }
});
rs.on('end', function() {
  // optionally process `buffer` here if you want to treat leftover data without
  // a newline as a "line"
  console.log('ended on non-empty buffer: ' + inspect(buffer));
});
Run Code Online (Sandbox Code Playgroud)