当前位置:  开发笔记 > 编程语言 > 正文

使用nodejs将非常大的记录集导入MongoDB

如何解决《使用nodejs将非常大的记录集导入MongoDB》经验,为你挑选了0个好方法。

在我深入研究我的问题之前,我想指出我正在做这个部分以熟悉node和mongo.我意识到可能有更好的方法来实现我的最终目标,但我想要摆脱的是一种可能适用于其他情况的一般方法.

目标:

我有一个包含600多万个地理IP记录的csv文件.每条记录总共包含4个字段,文件大约为180mb.

我想处理这个文件并将每条记录插入名为"Blocks"的MongoDB集合中.每个"块"将包含csv文件中的4个字段.

我目前的做法

我正在使用mongoose创建一个"Block"模型和一个ReadStream来逐行处理文件.我用来处理文件和提取记录的代码工作,如果我愿意,我可以让它将每条记录打印到控制台.

对于文件中的每个记录,它调用一个函数来创建一个新的Blocks对象(使用mongoose),填充字段并保存它.

这是每次读取和解析行时调用的函数内部的代码."rec"变量包含一个表示文件中单个记录的对象.

block = new Block();

block.ipFrom    = rec.startipnum;
block.ipTo      = rec.endipnum;
block.location  = rec.locid;

connections++;

block.save(function(err){

    if(err) throw err;
    //console.log('.');
    records_inserted++;

    if( --connections == 0 ){
        mongoose.disconnect();
        console.log( records_inserted + ' records inserted' );
    }

});

问题

由于文件是异步读取的,因此同时处理多行,并且读取文件比MongoDB可以写入的速度快得多,因此整个过程停留在大约282000条记录,并且高达5k +并发Mongo连接.它不会崩溃..它只是坐在那里什么都不做,似乎没有恢复,mongo集合中的项目计数也没有进一步.

我在这里所说的是解决这个问题的一般方法.我如何限制并发Mongo连接的数量?我想利用能够同时插入多个记录,但我错过了一种规范流量的方法.

先感谢您.

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有