【问题标题】:Copy line-by-line from one large file to another?从一个大文件逐行复制到另一个?
【发布时间】:2013-02-17 10:48:21
【问题描述】:

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

javascript - node.js: read a text file into an array. (Each line an item in the array.) - Stack Overflow

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

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

【问题讨论】:

标签: javascript node.js


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    • 1970-01-01
    相关资源
    最近更新 更多