0

我想用 Node.js 逐行处理一个大文件。它的大小为 100MB,有 500,000 行。我找到了这个解决方案来读取输入文件中的行

javascript - node.js:将文本文件读入数组。(每一行都是数组中的一个项目。) - VoidCC

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

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)。那么有人可以告诉我是否有任何方法可以优化它吗?

4

1 回答 1

1

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

当然有更简单的方法可以做到这一点,但我假设你想学习如何使用 Node.JS 中的流来做到这一点。在这种情况下,您可以用来替换大量附加和切片的一般技术是将数据累积在字符串数组中。您可以稍后将字符串数组加入单个数组,mystring.join("")然后将其转换["hello, ", "world"]"hello, world". 创建一个字符串数组然后一次将它们全部加入一个大字符串比创建字符串我将每个字符串附加到最后一个要快得多。

希望对您有所帮助,并且足以让您解决此问题并从中学到一些东西!

于 2013-03-03T07:31:29.320 回答