让我们创建一个巨大的文件:
$ base64 /dev/urandom | head -1000000 > /tmp/crap
$ wc -l /tmp/crap
1000000 /tmp/crap
$ du -sh /tmp/crap
74M /tmp/crap
这是你的代码:
$ cat /tmp/a.js
var fs = require('fs');
var filename = '/tmp/crap1';
fs.readFile(filename, function(err, data) {
if(err) throw err;
theFile = data.toString().split("\n");
theFile.splice(-3,3);
fs.writeFile(filename, theFile.join("\n"), function(err) {
if(err) {
return console.log(err);
}
console.log("Removed last 3 lines");
console.log(theFile.length);
});
});
这是我的:
$ cat /tmp/b.js
var fs = require('fs'),
util = require('util'),
cp = require('child_process');
var filename = '/tmp/crap2';
var lines2nuke = 3;
var command = util.format('tail -n %d %s', lines2nuke, filename);
cp.exec(command, (err, stdout, stderr) => {
if (err) throw err;
var to_vanquish = stdout.length;
fs.stat(filename, (err, stats) => {
if (err) throw err;
fs.truncate(filename, stats.size - to_vanquish, (err) => {
if (err) throw err;
console.log('File truncated!');
})
});
});
让我们复制同一文件:
$ cp /tmp/crap /tmp/crap1
$ cp /tmp/crap /tmp/crap2
让我们看看谁更快:
$ time node a.js
Removed last 3 lines
999998
node a.js 0.53s user 0.19s system 99% cpu 0.720 total
$ time node b.js
File truncated!
node b.js 0.08s user 0.01s system 100% cpu 0.091 total
当我将文件大小增加 10 倍时,我的系统 a.js 内存不足;但对于 b.js,需要:
$ time node b.js
File truncated!
node b.js 0.07s user 0.03s system 6% cpu 1.542 total
我的代码使用tail,它不会读取整个文件,它会查找到末尾,然后向后读取块,直到达到预期的行数,然后以正确的方向显示行,直到文件末尾。现在我现在的字节数消失了。然后我用fs.stat,它告诉我文件中的总字节数。现在,我知道在删除最后的文件后,我实际上想要在文件末尾有多少字节n
线。最后,我用fs.truncate,这会导致常规文件被截断为与其指定的大小(以字节为单位)完全相同的大小。
Update:
OP说平台是Windows。在这种情况下,我们可以将这个程序修改为not调用另一个实用程序,但在节点本身中执行所有操作。幸运的是,所需的功能已经作为节点模块提供给我们了read-last-lines。现在,更新后的与操作系统无关的代码如下所示:
$ npm install read-last-lines
$ cat /tmp/c.js
var fs = require('fs'),
rll = require('read-last-lines');
var filename = '/tmp/crap2';
var lines2nuke = 3;
rll.read(filename, lines2nuke).then((lines) => {
var to_vanquish = lines.length;
fs.stat(filename, (err, stats) => {
if (err) throw err;
fs.truncate(filename, stats.size - to_vanquish, (err) => {
if (err) throw err;
console.log('File truncated!');
})
});
});
对于 10 倍大小的文件,需要:
$ time node c.js
File truncated!
node c.js 0.14s user 0.04s system 8% cpu 2.022 total