我是 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 。我该怎么做,请用例子说明方法(如果可能的话)。
答案 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。它全部是为动态服务器设计的,因此您可以运行代码并且几乎一直在读取文件,但没有为每个文件读取维护新线程/进程的开销(哪些服务器通常使用线程池)。 (我认为这是正确的吗?)