node.js - nodejs 队列大数组内存溢出
PHP中文网
PHP中文网 2017-04-17 15:51:41
0
1
448

报错如下
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... 跟这个情况类似
请问怎么解决比较好 能不能不断清楚内存的垃圾?

PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(1)
洪涛
  • 如果我沒數錯的話,你是一次性取出10萬條,如果估算你的一行記錄是10K的話,10萬條的話,大概就是1個G的內存,所以出現OOM

  • 對於這種問題最好的處理方式就是流處理,你會需要這個方法的,把每一次的highWaterMark設定成1萬,比方說你總共有100萬個資料要取出來,你也不用自己去控制了你程式碼下面的array和load,寫好每次處理1萬的ReadStream流处理,你会需要这个方法的,把每一次的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根据自己实际业务改改

注:最好设置ReadStreamhighWaterMark比mysql的读数据的stream要大一些,要不然数据来不及consumer

🎜TALK IS CHEAP, SHOW ME THE CODE🎜🎜 rrreee 🎜🎜🎜偽代碼如上圖所示,untest依自己實際業務改改🎜🎜
🎜註:最好設定ReadStreamhighWaterMark比mysql的讀資料的stream要大一些,要不然資料來不及consumer的話會遺失資料的喲! ! 🎜🎜
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板