如何解决node.js中由于.map函数而导致的内存泄漏
我正在尝试使用node.js应用程序将900万条记录从mssql数据库导出到mysql数据库 我遇到了一个内存问题,我怀疑这是由于我的map函数造成的 下面的myfunction()调用doThis()函数,该函数从我的Mssql数据库中获取一组记录,然后将记录插入MySql数据库如何解决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:
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,可能是由于额外的异步/等待造成的。此外,我们还可以显式删除未使用的返回结果。。或我不确定具体是什么,让我们打电话给调试专家。)