如何对 node.js 中的大文件执行 read/write 之类的操作?

How do I perform operations like read/write to a heavy file in node.js?

我对 node.js 很陌生,我想对大文件(通常为 5GB ~ 10GB)执行操作(如读取、写入或存储在数据库中) .
有哪些可能的方法可以快速完成并且不影响主线程([=3​​7=])。我需要实现多线程吗?

我认为由于I/O操作是异步的,它永远不会影响主线程。我曾尝试读取一个大文件并将内容写入 HTTPresponse 对象,就像这样 -

var http = require('http'),
fs = require('fs');
fs.readFile('largefile.txt',function(err,data){
    if(err) {
        throw err;
    }
    http.createServer(function(request,response){
        response.writeHead(200,{
            "Content-Type" : "text/plain"
        });
        response.end(data);
    }).listen(8080);
    console.log("server started");
});

这里的largefile.txt大小只有.25GB,用了差不多5此节目的分钟 到 运行。现在实际上,我希望大小为(如前所述)5~10GB,文件类型可以是 .csv,.xls。我应该怎么做,请举例说明方法(如果可能的话)。

从磁盘读取工作程序内存非常慢。这是硬件限制。

如果文件是 CSV(用换行符分隔的逗号分隔值),您可能想逐行读取它,或者搜索正确的行然后读取,而不是将整个文件读入内存并然后把整个东西打印出来。如果您逐行阅读它,至少您正在更新正在阅读的内容。

首先,您可以使用 fs.read 而不是 fs.readFile 逐字符读取文件,寻找换行符。

但是对 "nodejs read file line" 的快速搜索表明还有许多其他方法可以使用 Node 来解决这个问题。

编辑:

我还不能发表评论,但是关于子进程,正如 jfriend00 和 SirDemon 所说,虽然 NodeJS 使用非阻塞 IO(读取磁盘到内存不会阻塞代码)并且它通常 event-oriented/asynchronous 在设计(执行可能会在代码段之间交换,而它正在等待东西)代码仅 运行 在单个 CPU 上单线程(代码仍然阻塞代码)。因此,子进程允许您使用另一个 CPU。它都是为动态服务器设计的,所以你可以让代码 运行ning 和文件几乎一直被读取,但没有为每个读取的文件维护一个新的 thread/process 的开销(服务器通常使用线程池)。 (我认为这是正确的?)