在我深入研究我的问题之前,我想指出我正在做这个部分以熟悉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连接的数量?我想利用能够同时插入多个记录,但我错过了一种规范流量的方法.
先感谢您.