Node大文件处理

Posted cqq626

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node大文件处理相关的知识,希望对你有一定的参考价值。

之前有个需求要将文件解析再处理,当时直接将整个文件内容读到内存中然后解析,也是没有考虑到大文件的问题,那么要如何解析大文件呢?

输入:文件的内容是多个json,按顺序排列

输出:解析后的json数据

代码:

 1 let fs = require(\'fs\');
 2 
 3 let log = (str) => { console.log(`${new Date().toLocaleString()} ${str}`); };
 4 
 5 let readStream = fs.createReadStream(\'./input.txt\', {encoding: \'utf-8\'});
 6 let chunkTotal = \'\',
 7     res = [],
 8     reg = /(}\\s*{)/g;
 9 
10 console.time(\'parse\');
11 
12 readStream.on(\'readable\', () => {
13     log(\'readable triggerd\');
14     let chunk;
15 
16     while ((chunk = readStream.read()) !== null) {
17         log(`read triggerd, chunk length ${chunk.length}, current res length ${res.length}`);
18         chunkTotal += chunk;
19 
20         let regRes, matchedIndex = 0, srcIndex = 0;
21         while ((regRes = reg.exec(chunkTotal))) {
22             matchedIndex = regRes.index;
23             let json = chunkTotal.slice(srcIndex, matchedIndex + 1);
24             try {
25                 res.push(JSON.parse(json.trim()));
26             } catch (e) {
27                 console.log(json);
28             }
29 
30             srcIndex = matchedIndex + 1;
31         }
32         chunkTotal = chunkTotal.slice(matchedIndex + 1).trim();
33     }
34 
35     let json;
36     try {
37         json = JSON.parse(chunkTotal.trim());
38         res.push(json);
39         chunkTotal = \'\';
40     } catch (e) {}
41 });
42 
43 readStream.on(\'end\', () => {
44     log(`总共编译得到数据:${res.length}个`);
45     console.timeEnd(\'parse\');
46 });

 

实际运行过程中发现程序越跑越慢:

当解析到100多w条json数据时,慢的不能忍

 

当把代码改成只统计能解析得到的json数量,不保存json数据后,代码就嗖嗖的跑完了。

难道是因为占用内存过高,影响垃圾回收速度?

能不能利用多进程来处理一个大文件?

 

原因是正则的问题导致效率下降,按行读取还是用readline比较好

以上是关于Node大文件处理的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段13——Vue的状态大管家

VSCode自定义代码片段13——Vue的状态大管家

VSCode自定义代码片段13——Vue的状态大管家

Node.js JavaScript 片段中的跳过代码

如何有效地打开 30gb 的文件并处理其中的片段而不减慢速度?

python常用代码片段总结