【nodejs】FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
当使用大批量(>100)的SQL进行MySql数据库插值任务时,会发生以下错误:
总计将有371579条数据将被插入数据库 开始插入DB <--- Last few GCs ---> [12416:000001BE7F7E63A0] 81278 ms: Mark-sweep 1410.0 (1443.8) -> 1410.0 (1443.8) MB, 1911.9 / 0.0 ms last resort <--- JS stacktrace ---> ==== JS stack trace ========================================= Security context: 000000C777FA8799 <JSObject> 2: createQuery [C:\Users\horn1\Desktop\node.js\66-??????1.09 - insertdb.js\node_modules\mysql\lib\Connection.js:64] [bytecode=000002482E476A59 offset=166](this=000000F8C033D3E1 <JSFunction Connection (sfi = 000002A3CFFB6579)>,sql=000002A3CFFADB71 <String[101]: insert into test.topic17(floor,author,tdate,ttime,addtime,url,title,content) values (?,?,?,?,?,?,?,?)>,values=00000245428FEC61 <JSA... FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory C:\Users\horn1\Desktop\node.js\66-理想论坛爬虫1.09 - insertdb.js>
因为插入的数据有37万条之多,无论使用下面哪种程序都会导致这样的结果:
插入代码1:
//====================================================== // 在理想论坛帖子下载爬虫生成数据文件后读取数据插入数据库 // 2018年5月6日 //====================================================== var fs=require('fs'); // 内置文件处理模块 var allfiles=[]; // 全部数据文件列表 var allInfos=[]; // 数据文件里获得的全部信息 //-------------------------------------- // 将数据插入数据库 //-------------------------------------- function insertDB(){ console.log("开始插入DB"); //console.log('总计将有'+allInfos.length+"条数据将被插入数据库"); var mysql=require('mysql'); // 连接mysql数据库的模块 var conn=mysql.createConnection({ host:'127.0.0.1', port:'3306', database:'test', user:'root', password:'12345678', }); conn.connect(function(err){ if(err){ console.log('与MySQL数据库建立连接失败'); }else{ console.time('插数据花费时间'); for(var i=0;i<allInfos.length;i++){ var info=allInfos[i]; sql='insert into test.topic17(floor,author,tdate,ttime,addtime,url,title,content) values (?,?,?,?,?,?,?,?)'; arr=[info['楼层'],info['作者'],info['日期'],info['时间'],currTime(),info['url'],info['title'],info['内容']]; conn.query(sql,arr,function(err,result){ if(err){ console.log("出现异常:"+err+",此时info="+info); } }) } //conn.end(); console.timeEnd('插数据花费时间'); } }); } //-------------------------------------- // 通用函数,返回当前日期时间 数据库记录时间用 //-------------------------------------- function currTime() { var date = new Date(); var seperator1 = "-"; var seperator2 = ":"; var month = date.getMonth() + 1; var strDate = date.getDate(); if (month >= 1 && month <= 9) { month = "0" + month; } if (strDate >= 0 && strDate <= 9) { strDate = "0" + strDate; } var currentdate =date.getFullYear() + seperator1 + month + seperator1 + strDate + " " + date.getHours() + seperator2 + date.getMinutes() + seperator2 + date.getSeconds()+ " "; return currentdate; } //------------------------------- // 得到带颜色(前景色)的文字,用于在控制台输出 // text:文字,color:前景色 //------------------------------- function coloredText(text,color){ var dic = new Array(); dic["white"] = ['\x1B[37m', '\x1B[39m']; dic["grey"] = ['\x1B[90m', '\x1B[39m']; dic["black"] = ['\x1B[30m', '\x1B[39m']; dic["blue"] = ['\x1B[34m', '\x1B[39m']; dic["cyan"] = ['\x1B[36m', '\x1B[39m']; dic["green"] = ['\x1B[32m', '\x1B[39m']; dic["magenta"] = ['\x1B[35m', '\x1B[39m']; dic["red"] = ['\x1B[31m', '\x1B[39m']; dic["yellow"] = ['\x1B[33m', '\x1B[39m']; return dic[color][0]+text+dic[color][1]; } function readFiles(){ if(allfiles.length>0){ var file=allfiles.pop(); fs.readFile(file,'utf8',function(err,data){ if(err){ console.log('读取文件失败,因为'+err); }else{ var infos=JSON.parse(data); allInfos=allInfos.concat(infos); } readFiles(); }); }else{ console.log('总计将有'+allInfos.length+"条数据将被插入数据库"); insertDB(); } } //-------------------------------------- // 入口函数 //-------------------------------------- function main() { folder='./test';// 数据文件所在目录 fs.readdir(folder,function(err,files){ if(err) throw err; // 预制查找数组 var arr=new Array(100-1);// 20563是总文件个数,从lixiang.js的输出可以找到,-1因为文件序号从0起 for(var i=0;i<arr.length;i++){ arr[i]=0; } // 只遍历一遍 for(var index in files){ var arrTmp=files[index].split("."); var sn=parseInt(arrTmp[0],10); arr[sn]=1; allfiles.push(folder+'/'+files[index]); } // 查哪个缺失 var missed=0; for(var i=0;i<arr.length;i++){ if(arr[i]==0){ // 为零的就是没找到该编号对应的文件的 console.log(coloredText('编号为'+i+'的文件缺失','yellow')); missed++; } } console.log(coloredText('总计有'+missed+'个文件缺失','red')); readFiles(); }); } // 开始 main();
插入代码2:
//====================================================== // 在理想论坛帖子下载爬虫生成数据文件后读取数据插入数据库 // 2018年5月6日 //====================================================== var fs=require('fs'); // 内置文件处理模块 var allfiles=[]; // 全部数据文件列表 var allInfos=[]; // 数据文件里获得的全部信息 //-------------------------------------- // 将数据插入数据库 //-------------------------------------- function insertDB(){ console.log("开始插入DB"); //console.log('总计将有'+allInfos.length+"条数据将被插入数据库"); var mysql=require('mysql'); // 连接mysql数据库的模块 var pool=mysql.createPool({ host:'127.0.0.1', port:'3306', database:'test', user:'root', password:'12345678', connectionLimit:10, }); pool.getConnection(function(err,conn){ console.time('插数据花费时间'); for(var i=0;i<allInfos.length;i++){ var info=allInfos[i]; sql='insert into test.topic17(floor,author,tdate,ttime,addtime,url,title,content) values (?,?,?,?,?,?,?,?)'; arr=[info['楼层'],info['作者'],info['日期'],info['时间'],currTime(),info['url'],info['title'],info['内容']]; conn.query(sql,arr,function(err,result){ if(err){ console.log("出现异常:"+err+",此时info="+info); } }) } console.timeEnd('插数据花费时间'); conn.close(); }); } //-------------------------------------- // 通用函数,返回当前日期时间 数据库记录时间用 //-------------------------------------- function currTime() { var date = new Date(); var seperator1 = "-"; var seperator2 = ":"; var month = date.getMonth() + 1; var strDate = date.getDate(); if (month >= 1 && month <= 9) { month = "0" + month; } if (strDate >= 0 && strDate <= 9) { strDate = "0" + strDate; } var currentdate =date.getFullYear() + seperator1 + month + seperator1 + strDate + " " + date.getHours() + seperator2 + date.getMinutes() + seperator2 + date.getSeconds()+ " "; return currentdate; } //------------------------------- // 得到带颜色(前景色)的文字,用于在控制台输出 // text:文字,color:前景色 //------------------------------- function coloredText(text,color){ var dic = new Array(); dic["white"] = ['\x1B[37m', '\x1B[39m']; dic["grey"] = ['\x1B[90m', '\x1B[39m']; dic["black"] = ['\x1B[30m', '\x1B[39m']; dic["blue"] = ['\x1B[34m', '\x1B[39m']; dic["cyan"] = ['\x1B[36m', '\x1B[39m']; dic["green"] = ['\x1B[32m', '\x1B[39m']; dic["magenta"] = ['\x1B[35m', '\x1B[39m']; dic["red"] = ['\x1B[31m', '\x1B[39m']; dic["yellow"] = ['\x1B[33m', '\x1B[39m']; return dic[color][0]+text+dic[color][1]; } function readFiles(){ if(allfiles.length>0){ var file=allfiles.pop(); fs.readFile(file,'utf8',function(err,data){ if(err){ console.log('读取文件失败,因为'+err); }else{ var infos=JSON.parse(data); allInfos=allInfos.concat(infos); } readFiles(); }); }else{ console.log('总计将有'+allInfos.length+"条数据将被插入数据库"); insertDB(); } } //-------------------------------------- // 入口函数 //-------------------------------------- function main() { folder='./2018-05-05 9_8_49';// 数据文件所在目录 fs.readdir(folder,function(err,files){ if(err) throw err; // 预制查找数组 var arr=new Array(23000-1);// 20563是总文件个数,从lixiang.js的输出可以找到,-1因为文件序号从0起 for(var i=0;i<arr.length;i++){ arr[i]=0; } // 只遍历一遍 for(var index in files){ var arrTmp=files[index].split("."); var sn=parseInt(arrTmp[0],10); arr[sn]=1; allfiles.push(folder+'/'+files[index]); } // 查哪个缺失 var missed=0; for(var i=0;i<arr.length;i++){ if(arr[i]==0){ // 为零的就是没找到该编号对应的文件的 console.log(coloredText('编号为'+i+'的文件缺失','yellow')); missed++; } } console.log(coloredText('总计有'+missed+'个文件缺失','red')); readFiles(); }); } // 开始 main();
究其原因,应该是数据库并发数有限,有太多的回调来不及执行而堆积起来造成的堆缺乏存储空间。
这是关于此问题的一些讨论 https://cnodejs.org/topic/500904be4764b72902d30f4d
2018年5月7日
【nodejs】FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory的更多相关文章
- 解决 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 问题
https://blog.csdn.net/weixin_41196185/article/details/81114226 今天在启动vue项目的时候报了这样一个错误 观察到关键词是 FATAL E ...
- FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
vue项目 npm run dev 报错 WAIT Compiling...16:36:21 95% emittingFATAL ERROR: CALL_AND_RETRY_LAST Allocati ...
- angular4 JavaScript内存溢出问题 (FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory)
最近在写基于angular4的项目的时候,在build --prod的时候,突然措手不及的蹦出个报错,大致错误如下: 70% building modules 1345/1345 modules 0 ...
- Angular JavaScript内存溢出问题 (FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory)
方法一和方法二参考:https://www.cnblogs.com/liugang-vip/p/6857595.html 方法一:my-project/node_modules/.bin 下增大内存( ...
- 解决Vue编译和打包时频繁内存溢出情况CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
解决Vue编译和打包时频繁内存溢出情况CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 如上图所示:频繁出现此 ...
- Vue项目运行或打包时,频繁内存溢出情况CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
前端使用基于vue的Nuxt框架,但是随着项目功能增多,项目变大,频繁出现此种情况,原因是项目太大,导致内存溢出,排除代码问题外,可参照以下方式解决 解决方案 1.全局安装increase-memor ...
- node 打包内存溢出 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
electron-vue加载了地图 openLayer后,打包就包内存溢出 解决办法: "build": "node --max_old_space_size=4096 ...
- webpack 内存溢出 Allocation failed - JavaScript heap out of memory
项目中,当组件文件过多,webpack-dev-server 编译时,容易内存溢出, 在 \node_modules\.bin\webpack-dev-server.cmd 加以下红色配置,暂可解决 ...
- nodejs内存溢出 FATAL ERROR: CALL_AND_RETRY_0 Allocation failed – process out of memory
spa项目整体迁移转为ssr后,改动之后部署一切还好,就是突然有一天访问人数太多,node进程很容易就挂了自动重启. 最后经过压力测试,考虑到是堆内存溢出的问题,就报错误:FATAL ERROR: C ...
随机推荐
- android操作sqlite数据库及心得
写这篇文章主要是网上的对sqlite的操作太多且太杂,非常多时候都不能非常好的运用到自己的项目中,结构不清晰,我自己写了一篇适合刚刚接触的人看的操作方法. 近来用android时要将一些数据保存起来, ...
- RabbitMQ的应用场景以及基本原理介绍(转)
本文转自https://blog.csdn.net/whoamiyang/article/details/54954780 1.背景 RabbitMQ是一个由erlang开发的AMQP(Advanve ...
- ibatis.net:尽可能的使用匿名类型替换 Hashtable
一切尽在代码中 Hashtable 风格 public Account GetByCustomIdAndAccountType(int customId, AccountType accountTyp ...
- IntelliJ IDEA2018.1、2017.3激活
IntelliJ IDEA2018.1.2017.3破解教程 http://idea.java.sx/ 简单快捷!! ———————————————————————————————————————— ...
- intellij idea 无法启动或调试 spring-boot
解决方案一: 原因是因为Working directory没有指定, 并且运行前要手动执行mvn clean install命令才可以.所以导致错误了.希望大家不要犯类似错误. 解决方式二: 看看你的 ...
- 新闻编辑室第三季/全集The Newsroom迅雷下载
第三季 The Newsroom Season 3 (2014)看点:今日他们终于公布了续订第三季的消息,但同时也宣称第三季将会是<新闻编辑室>的最终季,对剧迷们来说可谓苦乐参半.讲述了一 ...
- 实用ExtJS教程100例-008:使用iframe填充ExtJS Window组件
上面两节中我们分别演示了ExtJS Window的常用功能 和 如何最小化ExtJS Window组件,在这篇内容中我们来演示一下如何使用iframe填充window组件. 思路很简单,首先创建一个w ...
- SQLite中的事务操作
关于SQLite事务可以解决一些问题,比如你要插入两个数据,可以将两个数据作为同一个事务进行插入,这样如果第二个数据错误了,便自动执行回滚操作,第一个数据也不会插入成功,保证了数据的同步! 一.实际的 ...
- SVG.Js事件示例,简单绑定拖动操作
一.代码: var draw = SVG('container').size(300, 300); draw.style({ border: '1px solid red' }); var group ...
- 【转】memcached分布式部署
FROM : http://www.tuicool.com/articles/777nE3j memcache和memcached两者使用起来几乎一模一样. $mem = new Memcache; ...