我需要将一个巨大的文件转换成以下格式:对于每个字节,将该字节打印为字符并在括号中打印其十进制值,以便“@”变为“@ [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”行占用了大部分时间。所以我猜问题不在于文件阅读。不过,问题仍然存在 - 如何加快速度。
答案 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
并走过缓冲区。