加速node.js数组操作

时间:2011-10-14 13:09:50

标签: javascript node.js io

我需要将一个巨大的文件转换成以下格式:对于每个字节,将该字节打印为字符并在括号中打印其十进制值,以便“@”变为“@ [64]”。我有以下内容:

var s = fs.createReadStream(path,  { encoding: 'binary' });  
var p = [];

s.addListener('data', function(data) {     
    for(var i = 0; i < data.length; i++) {
            p.push(data.charAt(i)  + "[" + data.charCodeAt(i) + "]");
    }
});

s.addListener('end', function(data) {     
    console.log(p.join(""));
});

然而,这种作品完全缓慢。任何想法如何优化?

UPD。根据评论,添加了一些日期声明,发现“p.push”行占用了大部分时间。所以我猜问题不在于文件阅读。不过,问题仍然存在 - 如何加快速度。

1 个答案:

答案 0 :(得分:0)

如果文件是utf-8,你可能想要先解码它。另外,不要使用二进制编码,现在基本上已弃用。

以下是一个例子:

var fs = require('fs')
  , StringDecoder = require('string_decoder').StringDecoder;

var stream = fs.createReadStream('/path/to/my/file')
  , decode = new StringDecoder('utf8')
  , out = [];

stream.on('data', function(buff) {
  buff = decode.write(buff);
  for (var i = 0, l = buff.length; i < l; i++) {
    out.push(buff[i] + ' [' + buff.charCodeAt(i) + ']');
  }
});

stream.on('end', function() {
  console.log(out.join('\n'));
});

为了简单起见,您还可以使用读取流的内置解码功能:stream.setEncoding('utf-8');而不是制作自己的StringDecoder,但在某些情况下使用自己的解码流非常有用,例如你仍然可以直接访问缓冲区。

编辑:抱歉,没看到您要求进行优化。你正在做的事情本来就很慢。我以为你只是想把它用于调试目的。可能只是有一种更好的方式来做你想要做的事情。但是,既然你无论如何要缓冲一切,你也可以只做一个fs.readFile并走过缓冲区。