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数据后,代码就嗖嗖的跑完了。

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

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

时间: 2024-10-10 14:54:30

Node大文件处理的相关文章

个人第一个开源分布式项目distributeTemplate的实现三 网络通讯netty传输大文件

今天 我将讲讲网络通讯,这里我初始版本 由于采用的事Netty框架  所以 这里讲网络Netty在我们这里是怎么使用的,下周开始添加rpc lucene内容了 实现之后的0.2 0.3版本,后面将会去掉netty依赖 采用原生的NIO2 (aio) 异步非阻塞方式 实现自己网络通讯,也就是说 这部分可能会实现一个简单的但是比netty精简高效的网络框架,后期做出来 可能会单独开一个分支开源出来,netty说白了 就是 事件驱动 以及 NIO 加一些协议 以及 异常 处理,废话不多说了. 我最近

node压缩文件夹

前几天遇到一个需求,将一个10G的文件夹打包压缩,并去除黑名单上的文件. node自带的只能压缩文件.网上看了集中方案要么对大文件操作不行,要么只能直接操作文件夹,无法对文件夹遍历筛选. 后来确定使用先遍历文件夹打包,然后再压缩的方案.然后在找打包模块时发现tar打包时可以直接压缩.试验后确定使用这种方案.本机试验,12G的文件夹,耗时大约18分钟. 代码如下,其中的tar时第三方模块,需要另外安装     npm install tar 1 var fs = require('fs') 2 v

node 复制文件

1. node 复制小文件 需要引用模块 require( 'fs' ): 使用 writeFileSync 和 readFileSync 复制小文件,大文件时会拖垮内存,不建议使用. 代码 var fs = require( 'fs' ); function copyfile(src,dir) { fs.writeFileSync(dir,fs.readFileSync(src)); } copyfile( 'D:\\from\\config.json', 'D:\\log\\dd.json'

5亿整数的大文件,怎么排?

题目和背景可以参看这里:http://weibo.com/p/1001603856172376577500 和 http://blog.jobbole.com/87600/ 这里不妨明确下题目:给定一个大文件,内含5亿个整数,每个整数都属于1-9999999之间.请设计方案,对这些元素进行排序,并将排序结果写成文件输出.可用内存不超过2G. 注意到元素一共有5亿个,因此,文件中肯定存在重复元素,也就是说有些元素不止出现一次,因此基于朴素的bitmap并不能胜任此题. 由于lau叔提供的数据集下载

Electron中实现大文件上传和断点续传功能

Electron官网的描述:Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库. Electron通过将Chromium和Node.js合并到同一个运行时环境中,并将其打包为Mac,Windows和Linux系统下的应用来实现这一目的. 从官网的描述我们可以简单的概括,Electron是开源的框架,可以使用h5来开发跨平台pc桌面应用,这样前端开发这可以开发桌面应用了.由于它是基于Chromium和Node.js开发的,所以在Ele

算法初级面试题05——哈希函数/表、生成多个哈希函数、哈希扩容、利用哈希分流找出大文件的重复内容、设计RandomPool结构、布隆过滤器、一致性哈希、并查集、岛问题

今天主要讨论:哈希函数.哈希表.布隆过滤器.一致性哈希.并查集的介绍和应用. 题目一 认识哈希函数和哈希表 1.输入无限大 2.输出有限的S集合 3.输入什么就输出什么 4.会发生哈希碰撞 5.会均匀分布,哈希函数的离散性,打乱输入规律 public class Code_01_HashMap { public static void main(String[] args) { HashMap<String, String> map = new HashMap<>(); map.p

GitHub限制上传大于100M的单个大文件

工作中遇到这个问题,一些美术资源..unitypackage文件大于100M,Push到GitHub时被拒绝.意思是Push到GitHub的每个文件的大小都要求小于100M. 搜了一下,很多解决办法只是把这些超过100M的大文件从本地版本库中移除,使得Push可以成功.但这并没有解决如何上传大文件到GitHub的问题. 解决办法是使用Git LFS. 用法参考:http://blog.csdn.net/tyro_java/article/details/53440666 按照以上方法设置好后,就

Node.JS 文件读写,把Sheet图集转换为龙骨动画图集

Node.JS 文件读写,把Sheet图集数据转换为龙骨动画图集数据 var fs = require("fs") var readline = require("readline"); var rl = readline.createInterface({ input:process.stdin, output:process.stdout }); var path = undefined; var dbName = undefined; rl.question(

split、rar拆分大文件

split拆分大文件 系统默认自带有 # split -b 2048m aa aa_ -b n[bkm]  b代表512b,k代表1KB,m代表1M 后面aa表示指定文件前缀 结果为:aa_aa aa_ab 合并拆分文件: # cat aa_aa aa_ab > aa rar拆分大文件 # apt-get install rar # rar a -v2048m aa.rar aa 结果为:aa.part1.rar aa.part2.rar 合并并解压: # unrar aa.part1.rar