如何对node.js中的重文件执行读/写操作?

时间:2015-08-05 05:08:09

标签: node.js multithreading io

我是 node.js 的新手,我想对大文件(通常为5GB~10GB)执行操作(如读取,写入或存储在DB中)。
有什么方法可以快速完成并且不影响主线程(UI)。我需要实现多线程吗?

我认为由于I / O操作是异步的,因此它永远不会影响主线程。我试图读取一个大文件并将内容写入 HTTP 响应对象 -

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 。我该怎么做,请用例子说明方法(如果可能的话)。

1 个答案:

答案 0 :(得分:0)

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

如果文件是CSV(由换行符分隔的逗号分隔值),您可能希望逐行读取,或者搜索右侧行然后读取,而不是将整个内容读入内存然后打印整件事。如果你一行一行地阅读它,至少你正在更新一些东西,因为它正在阅读。

首先,您可以使用fs.read代替 sample exprFile reaction_conc 1 A 140701_2014-07-03-15-49 59 2 A 140701_2014-07-03-15-49 70 3 NC_1 140701_2014-07-03-15-49 2 4 NC_1 140701_2014-07-03-15-49 3 5 NC_1 140701_2014-07-03-15-49 2 6 A 140701_2_2014-07-01-19-07 200 7 A 140701_2_2014-07-01-19-07 202 8 B 140701_2_2014-07-01-19-07 300 9 B 140701_2_2014-07-01-19-07 322 10 B 140701_2_2014-07-01-19-07 333 11 NC_1 140701_2_2014-07-01-19-07 8 12 NC_1 140701_2_2014-07-01-19-07 8 13 NC_2 140701_2_2014-07-01-19-07 4 14 D 140701_2014-07-02-20-53 44 15 NC_2 140701_2014-07-02-20-53 0 16 NC_2 140701_2014-07-02-20-53 2 17 NC_2 140701_2014-07-02-20-53 1 18 A 140708_2014-07-08-19-20 100 19 A 140708_2014-07-08-19-20 108 20 A 140708_2014-07-08-19-20 111 21 D 140708_2014-07-08-19-20 88 22 D 140708_2014-07-08-19-20 80 23 E 140708_2014-07-08-19-20 645 24 NC_3 140708_2014-07-08-19-20 8 25 NC_3 140708_2014-07-08-19-20 12 26 NC_1 140708_2014-07-08-19-20 4 27 NC_2 140708_2014-07-08-19-20 0 逐个字符地读取文件,查找换行符。

但快速搜索“nodejs read file line”表明还有很多方法可以通过Node来解决这个问题。

修改

我还不能发表评论,但关于子进程,正如jfriend00和SirDemon所说,虽然NodeJS使用非阻塞IO(读取磁盘到内存不会阻塞代码),但它通常是面向事件/异步的设计(执行可以在代码的各个部分之间进行交换,而代码只在单个CPU上运行(代码仍会阻塞代码)。因此子进程允许您使用另一个CPU。它全部是为动态服务器设计的,因此您可以运行代码并且几乎一直在读取文件,但没有为每个文件读取维护新线程/进程的开销(哪些服务器通常使用线程池)。 (我认为这是正确的吗?)