如何解决node.js中由于.map函数而导致的内存泄漏

如何解决node.js中由于.map函数而导致的内存泄漏,node.js,promise,bluebird,Node.js,Promise,Bluebird,我正在尝试使用node.js应用程序将900万条记录从mssql数据库导出到mysql数据库 我遇到了一个内存问题,我怀疑这是由于我的map函数造成的 下面的myfunction()调用doThis()函数,该函数从我的Mssql数据库中获取一组记录,然后将记录插入MySql数据库 Myfucntion(){ Promise.map(ids, id => doThis(id).then(results => console.log(results)), { concurrency:

我正在尝试使用node.js应用程序将900万条记录从mssql数据库导出到mysql数据库

我遇到了一个内存问题,我怀疑这是由于我的map函数造成的

下面的myfunction()调用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 old space size=20000来缓解这个问题

在执行doThis()函数的插入操作后,无需存储转换的资产


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

在一段代码中使用了太多的
async
promises
。另外,bluebird具有内部错误处理程序钩子,因此不必使用
try-catch
块(可能,此块会降低性能,请参阅本文:)

这是第一个简化版本:

const debug=require('debug')('my-app-name'))
Myfuction(){
return Promise.map(
身份证,
id=>doThis(id),
{并发:5}
)
}
函数doThis(id){
constresults=sql.query('selectresults其中id=${id}');
如果(
结果&&
结果记录集&&
results.recordset.length>0
) {
返回结果
.记录集
.map(资产=>InsertResultClass(ConvertResultSet(资产)))
。然后(res=>debug(res))
.catch(err=>debug('error',err);
}
返回空
}
我已经删除了
console.log
,bcz我不确定它的异步/同步性质,
debug
模块可能在大多数情况下工作得更好(但要查看它的输出,您应该运行带有环境标志的程序,如下所示:
debug=*nodejs app.js

我不确定这个问题是否100%解决了,因为还有两个未知函数:

  • insertresultlasset
  • convertResultAsset

这些函数可能包含闭包和不必要的锁变量吗?

my 50 cent:当处理9M记录时,您的代码应该针对性能而不是友好性进行优化。我认为您更适合使用classic for循环,而且……获取一堆ID然后查询这些ID有什么用?难道没有其他的方法吗她的方式?你正在尝试执行的是900万次查询吗?这段代码是用于转换的一次运行脚本还是将定期运行?InsertResultClass或
ConvertResultSet
实现可能存在漏洞。这非常简单!@user5328504,抱歉,我发送时没有代码。可能
Ctrl+Enter
是预处理的这有帮助。我完全按照你说的做了。我的记忆现在很稳定。仍然无法找出罪魁祸首到底是什么。实际上,如果我删除。然后(res=>debug(res)).catch(err=>debug('error',err))内存会返回up@user1526912,可能是由于额外的异步/等待造成的。此外,我们还可以显式删除未使用的返回结果。。或我不确定具体是什么,让我们打电话给调试专家。)