Javascript 将一行一行地从一个大文件复制到另一个大文件?

Javascript 将一行一行地从一个大文件复制到另一个大文件?,javascript,node.js,Javascript,Node.js,我想用Node.js逐行处理一个大文件。它的大小为100MB,有500000行。我发现这个解决方案可以读取输入文件中的行 现在是关于将每一行写入一个新的输出文件,所以我尝试 function readLines(input, func) { var remaining = ""; input.on("data", function(data) { remaining += data; var index = remaining.inde

我想用Node.js逐行处理一个大文件。它的大小为100MB,有500000行。我发现这个解决方案可以读取输入文件中的行

现在是关于将每一行写入一个新的输出文件,所以我尝试

function readLines(input, func)
{
    var remaining = "";

    input.on("data", function(data)
    {
        remaining += data;
        var index = remaining.indexOf("\n");
        var last = 0;
        while (index > -1)
        {
            var line = remaining.substring(last, index);
            last = index + 1;
            func(line);
            index = remaining.indexOf("\n", last);
        }

        remaining = remaining.substring(last);
    });

    input.on("end", function()
    {
        if (remaining.length > 0)
        {
            func(remaining);
        }
    });
}

function write(data)
{
    var written = output.write(data);
}

var fs = require("fs");
var input = fs.createReadStream("input.txt");
var output = fs.createWriteStream("output.txt", {flags: "w"});
readLines(input, write);

但是脚本速度非常慢,完全处理输入文件需要1个多小时,并且需要大量的CPU和RAM使用(CPU使用量为25,内存使用量高达200MB)。有人能告诉我有没有什么方法可以优化它吗?

你所面临的问题是,你总是1)附加到字符串,2)切片字符串。这两种操作都可能导致分配新字符串和复制旧数据,这是一个缓慢的过程。旧字符串不再被引用,因此最终会被垃圾收集释放,但这需要时间,因此会占用大量内存

当然,有更简单的方法可以做到这一点,但我假设您希望学习如何使用Node.JS中的流来实现这一点。在这种情况下,可以用来替换大量附录和切片的一般技术是将数据累积到字符串数组中。稍后,您可以使用
mystring.join(“”
)将字符串数组连接到单个数组中,这将
[“hello,,“world”]
转换为
“hello,world”
。创建一个字符串数组,然后将所有字符串一次连接成一个大字符串,要比创建字符串(我将每个字符串追加到最后一个字符串)快得多


希望这能帮助你解决这个问题,并从中学到一些东西

你检查过其他的答案了吗?例如