博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【nodejs】FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
阅读量:4961 次
发布时间:2019-06-12

本文共 5963 字,大约阅读时间需要 19 分钟。

当使用大批量(>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 
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
,sql=000002A3CFFADB71
,values=00000245428FEC61

因为插入的数据有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
= 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

插入代码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
= 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

 

究其原因,应该是数据库并发数有限,有太多的回调来不及执行而堆积起来造成的堆缺乏存储空间。

 这是关于此问题的一些讨论 

2018年5月7日

转载于:https://www.cnblogs.com/xiandedanteng/p/9000749.html

你可能感兴趣的文章
ASP.NET Excel数据导入数据库---2
查看>>
Instagram的技术架构
查看>>
嘉定三屠与扬州十屠
查看>>
Lua学习笔记9:多文件
查看>>
Qt 3D研究(九):尝试第二边缘检测方法
查看>>
GG同步sqlserver报错一个案例 Invalid date format
查看>>
Opencv246+vs2012生成不依赖编译环境的exe文件
查看>>
jquery对checkbox的操作汇总
查看>>
ps 第一篇
查看>>
nginx配置url中带问号的rewrite跳转
查看>>
SICP习题1.45解答
查看>>
[转]Delphi 控件属性和事件
查看>>
iOS:事件处理机制
查看>>
ASPose导出excel简单操作
查看>>
基础数据类型
查看>>
SQL Server开启远程连接
查看>>
codeforces 978C Letters
查看>>
联系作者
查看>>
PHP通用函数 - 日期生成时间轴
查看>>
Eclipse连接HBase 报错:org.apache.hadoop.hbase.PleaseHoldException: Master is initializing
查看>>