javascript - 将 100 万个对象发送到 Mongo DB,而不会耗尽内存

标签 javascript node.js mongodb

为了简单起见,我在这里使用了 for 循环来创建一个包含 100 万个对象的数组。

我想将数组中的每个对象发布到 mongo db。

我的内存总是不够用。

我知道我可以增加内存分配,但这不是我想要的解决方案。我也不想使用 mongo 的批量方法,原因超出了本示例的范围。

我知道必须有某种方法来发布这些对象,这意味着每次迭代都会释放内存(收集垃圾?) - 谁能告诉我它是什么?

谢谢!

此处当前代码供引用(这会导致分配错误):

var results = [];

for(var i = 1; i < 1000001; i++){

  results.push({"num":i});

}

async = require("async");
var mongodb = require('mongodb');

var MongoClient = mongodb.MongoClient;
var mongoUrl = 'mongodb://root@localhost:27017/results';

MongoClient.connect(mongoUrl, function (err, db) {

  var collection = db.collection('results');

  // 1st para in async.each() is the array of items
  async.each(results,
    // 2nd param is the function that each item is passed to
    function(item, callback){
      // Call an asynchronous function, often a save() to DB
      collection.insert(item, function (err, result) {
        if(err) console.log(err);
        console.log(item);
        callback();
      });
    },
    // 3rd param is the function to call when everything's done
    function(err){
      // All tasks are done now
      db.close();
    }
  );
});

最佳答案

async.each() 并行运行插入,因此它基本上启动了 1000000 个并发插入操作。

您可能希望通过使用 async.eachLimit() 将其限制为 100。

关于javascript - 将 100 万个对象发送到 Mongo DB,而不会耗尽内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40786554/

相关文章:

javascript - selenium-webdriver 与 Safari - 错误 : Server terminated early with status 1

javascript - 使用 Rails 检查是否启用了 Javascript(服务器端)

javascript - javascript模式匹配的正则表达式

javascript - 接收字符串并使用 date-fns 验证它是否是有效日期

javascript - javascript中这些变量有什么区别

mongodb - 用于 BLOB/文件存储的 .NET Web 服务/API

javascript - 在由 componentDidMount 创建的 React 中切换折叠

javascript - 至少有一个大写字母和一个数字的 jquery 或 javascript 密码生成器

java - 在 geojson 数据库中查找包含点 (x,y) 的多边形

r - 通过 Shinyapps.io 连接到 MongoDB Atlas