mysql - Node - 数据库工作内存不足的大型 for 循环

标签 mysql node.js database for-loop out-of-memory

所以我有大量数据需要在生成后放入数据库中。现在,无论我在生成数据时还是之后尝试执行此操作,都无关紧要。双向都会崩溃

我有这样的代码:

for(var i = 0; i<4000, i++){
    for(var z = 0; z<1000; z++){
        c.query("REPLACE INTO `"+i+"`VALUES ("+z+", "+data+",)", function (err){
            if(err){
                throw err;
            }
        });
    }
}

在外部 for 循环大约 100 次循环后,它被终止。当我查看内存信息时,内存不足。

如果我将其全部更改为自调用函数,并且调用延迟约 100 毫秒,我可以获得更好的结果(它可以达到约 1500 的外循环)。我认为这是因为事件队列有时间清理。

到目前为止,我已经尝试过各种我知道的方法。我已经尝试过redis,现在又尝试了mysql,都不起作用。它确实适用于 json 文件数据库,但不适用于这些。

任何人都知道我如何完成这个循环。这是一项一次性任务,所以速度根本不重要,我只需要它来完成哈哈。

编辑:这是正确的方向,但请保持超出最大调用堆栈大小。想不通。

async.eachOfSeries(chunk, function(item, key, outerCallback){
    async.eachOfSeries(item, function(value, slot, innerCallback){
        //console.log(slot);
        c.query("REPLACE INTO `"+key+"` (r, v) VALUES ("+slot+", "+value+")", function(err){
            if(err){
                throw err;
            }
        });
        innerCallback();
    }, function(err){
        outerCallback();
    });
}, function(err){
    callback();
});

我尝试设置回调延迟,但没有成功。

最佳答案

据我目前对问题的了解:

c.query() 是异步方法。 我会使用 async.eachSeries 循环(或async.eachLimit)。

或者,您可以使用 Promise 或 async/await。

编辑:

更改了调用 innerCallback 的位置。

async.eachOfSeries(chunk, function(item, key, outerCallback){
    async.eachOfSeries(item, function(value, slot, innerCallback){
        //console.log(slot);
        c.query("REPLACE INTO `"+key+"` (r, v) VALUES ("+slot+", "+value+")", function(err){
            if(err){
                throw err;
            }
            innerCallback(); // Add callback here
        });
        // innerCallback(); // Remove this call
    }, function(err){
        outerCallback();
    });
}, function(err){
    callback();
});

关于mysql - Node - 数据库工作内存不足的大型 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42592477/

相关文章:

MySQL - 限制用户只能使用分配给公司的产品

php - 使用 STR_TO_DATE 时的更新问题

mysql - 表格优化

php - 在不将当前用户的分数插入表中的情况下使用 PHP/MySQL 获取用户排名

javascript - 如何使用 Mongoose 模式获取数据并将其发送给客户端?

node.js - Gulp/Node - SASS 编译错误

mysql - 显示经理下的所有用户(直接或间接)- SQL

php - 如何使用 appcelerator titanium 和 php 将数据从 sqlite 数据库插入远程 mysql 数据库

javascript - mongodb 无法在 mac os 上启动

Android SQLite 获取 CursorIndexOutOfBoundsException