Node.js 产卵一只mongoinsert

Node.js 产卵一只mongoinsert,node.js,mongodb,Node.js,Mongodb,我的目标是插入非常大的csv,因此我不会像这样使用csv流: var myCollection = db.collection(myCollectionId); var q = async.queue(Collection.insert.bind(myCollection), 10); csv() .from.path(myFilePath, {columns: true})

我的目标是插入非常大的csv,因此我不会像这样使用csv流:

            var myCollection = db.collection(myCollectionId);

            var q = async.queue(Collection.insert.bind(myCollection), 10);

            csv()
            .from.path(myFilePath, {columns: true}) 
            .transform(function(data, index, cb){

                    q.push(data, function (err, res) {
                        if (err) return cb(err);
                        cb(null, res[0]);
                    });

            })
            .on('end', function () {

                q.drain = function() { 

                       //do some stufff
                };

            })
            .on('error', function (err) {
                res.end(500, err.message);
                console.log('on.error() executed');
            });

        });
但是,当文件变得非常大,比如超过7000万个文件,并且正在进行流式传输时,我的服务器速度非常慢,而且需要花费很长时间,而当我尝试在网站上加载页面时,在这个过程中会变得很无聊

为什么不能像这样使用cron作业执行mongo插入呢。我之所以这样问,是因为同一个插入从mongo命令行可能需要30秒

另外,不要介意readFile和lines部分,我这样做是因为我想测试在流程启动后(尚未实现)所有行何时都插入到集合中

}

您可以通过创建..直接从节点执行。你也可以

不知怎的,我错过了在cron中使用mongoimport的部分。如果我理解正确,您似乎知道要导入的csv,并且正在使用cron检查它们

您考虑过消息队列吗?这将允许您的处理器即时接收导入作业,而不是按间隔接收。这也会限制您的处理


如果需要更高的吞吐量,可以创建附加到同一队列的其他侦听器进程。他们将竞争下一份工作。这将允许您的解决方案进行扩展。

您不应该使用单个
插入调用。您正在强制
mongo
对每个调用执行内部同步——我认为如果采用并行方法,情况会更糟


用法:使用
数组调用
insert()
非常简单,为什么不从child\u进程执行mongoimport.exec?嗨,Josh,你是什么意思?我正试图在游戏中使用spawncron@SOUser我建议您在Node.js中执行此操作,而不是在命令行中。然而,我对我的答案进行了调整。当我尝试插入文档数组时,我得到:当我尝试插入文档数组时,我得到错误:文档超过了允许的最大bson大小16777216字节,并且我已经检查了数组,所有文档的格式都是{a:'hi',b:'there',c:'bye'。当我从大小100000变为1000000时,会出现错误。不要单独插入每个文档,但也不要同时插入所有文档!Mongo显然不是为每秒一百万次插入而设计的,也不是为一次插入70mb而设计的。编写代码以执行一系列具有可配置最大值的批量插入,并玩弄该数字,直到找到合适的值
var cronJob = require('cron').CronJob;
var spawn = require('child_process').spawn; 
var fs = require('fs');
function MongoImportEdgeFile(dataID, filePath){

var scriptPath = "/local/main/db/mongodb-linux-x86_64-2.4.5/bin/mongoimport";
console.log("script path = "+scriptPath)
var output = "";

 fs.readFile(filePath, 'utf-8',function(err, data) {

        if (err){
            console.log(err)
            throw err;
        }

        //console.log('data = '+data);
        var lines = data.split('\n');
        console.log("total lines in file = " + lines);

        var job = new cronJob(new Date(), function() {
            // store reference to 'this', which is cronJob object.  needed to stop job after script is done executing.
            var context = this;

            // execute R script asynchronously
            var script = spawn(scriptPath, [" -d mydb -c Data_ForID_" + dataID + " --file " + filePath + " --type csv" ]);
            console.log("Executing R script via node-cron: " + scriptPath);

            // script has finished executing, so complete cron job and fire completion callback
            script.on('close', function() {
                console.log('inside script.on(close, function() for import');
                context.stop();
            });
        }, function() {
            // callback function that executes upon completion
            console.log("Finished executing import");

        }, true);

   });