2017-04-17 25 views
0

我想使用的Node.js应用如何解决内存泄漏因.MAP功能

从我的MSSQL数据库9万条记录导出到一个MySQL数据库我遇到了内存问题的node.js ()蓝色鸟Promise.map

下面的Myfucntion()调用doThis()函数,它从我的Mssql数据库获取一组记录,然后将记录插入MySql数据库。

Myfucntion(){ 
Promise.map(ids, id => doThis(id).then(results => console.log(results)), { concurrency: 5}); 
} 

const doThis = async (id) => { 
    try{ 
     const results = await sql.query`select results where id = ${id}`; 
     if((results && results.recordset) && results.recordset.length > 0) { 
      results.recordset.map(asset => insertResultslAsset(convertResultAsset(asset))); 
     } 
    } 
    catch(err){ 
     console.log(err) 
    } 
}; 

convertResultAsset(asset)函数在插入之前创建一个4属性对象。

我怀疑发生存储器泄漏,因为经转换的资产被递增地存储在存储器中与所述.MAP迭代

我能够通过上运行--max岁空间尺寸= 20000到缓解了问题该程序。

在执行doThis()函数的插入之后,我不需要存储转换后的资产。

有没有办法从.map函数释放这些对象?

+0

我的50美分:处理9M记录时,您的代码应该针对性能进行优化,而不是对友好性进行优化。我认为你最好使用经典的for循环,并且......获得一堆id然后查询它们有什么用?还有另一种方式吗?这些9毫升的查询是你想要执行的吗?此代码是转换的运行一次脚本吗?还是会定期运行? – user5328504

+0

'insertResultslAsset'或'convertResultAsset'实现可能会泄漏。 – Will

回答

1

在一块代码中有太多的asyncpromises。此外,蓝鸟有内部错误处理程序挂钩,所以没有必要使用try-catch块(可能,这一块可能会降低性能,请参阅这篇文章:optimization-killers

这是第一个简化版本:

const debug = require('debug')('my-app-name') 

Myfucntion(){ 
    return Promise.map(
     ids, 
     id => doThis(id), 
     { concurrency: 5} 
    ) 

} 

function doThis(id) { 
    const results = sql.query('select results where id = ${id}'); 
    if (
     results && 
     results.recordset && 
     results.recordset.length > 0 
    ) { 
     return results 
      .recordset 
      .map(asset => insertResultslAsset(convertResultAsset(asset))) 
      .then(res => debug(res)) 
      .catch(err => debug('error', err); 
    } 
    return null 
} 

我已经删除了console.log,bcz我不确定它的异步/同步性质,debug模块可能在大多数情况下效果更好(但要看到它的输出,您应该使用环境标志运行程序,如下所示:DEBUG=* nodejs app.js

而且我不知道100%这个问题就解决了,因为两个未知的功能仍然存在:

  • insertResultslAsset
  • convertResultAsset

可能是这些功能包括封锁,以及不必要的锁变量?

+1

这非常简单! – user5328504

+0

@ user5328504,对不起,我没有发送代码。可能'Ctrl + Enter'被按到早期))) – maxkoryukov

+0

这有帮助。我完全按照你所说的去做。我的记忆现在非常稳定。仍然无法弄清究竟是什么罪魁祸首。 – user1526912