报错如下
FATAL ERROR: CALL_AND_RETRY_0 Allocation failed - process out of memory
我的代码
connection.query('select * from `table` limit 100000', function(err, rows, fields) { 数据库里的链接大概做了个队列 就是 不断取数据 大概每次做 1W 大多时候 运行不稳定 出如上报错 var array = [1,2,3,4]; function check() { if(array.length > 0) var url = array.pop(); load(url); }} function load(url) { http.get(url, function(res){ check(); ) }}
http://stackoverflow.com/ques... 跟这个情况类似
请问怎么解决比较好 能不能不断清楚内存的垃圾?
如果我没数错的话,你是一次性取出10万条,如果估算你的一行记录是10K的话,10万条的话,大概就是1个G的内存,所以出现OOM
对于这种问题最好的处理方式就是流处理
,你会需要这个方法的,把每一次的highWaterMark
设置成1万,比方说你总共有100万条数据要取出来,你也不用自己去控制了你代码下面的array和load,写好每次处理1万的ReadStream
TALK IS CHEAP, SHOW ME THE CODE
const SQL_SINGLE_RETURN_ROWS = 20000 const resStream = new Readable({ highWaterMark: SQL_SINGLE_RETURN_ROWS, objectMode: true }) resStream.on('data', () => { }) resStream.on('end', () => { // stream end }) const SQL = 'select * from `table` limit 100000' const query = connection.query(SQL).stream({ highWaterMark: SQL_SINGLE_RETURN_ROWS / 2 }) query.pipe(resStream) query.on('error', e => console.error(e)) query.on('end', () => { // if you need release conn // connection.release() })
伪代码如上所示,untest
根据自己实际业务改改
注:最好设置
ReadStream
的highWaterMark
比mysql的读数据的stream要大一些,要不然数据来不及consumer
的话会丢失数据的哟!!