使用nodejs将一个非常大的logging集导入到MongoDB中

在深入探讨我的问题之前,我想指出,我正在做这个部分来熟悉节点和mongo。 我意识到可能有更好的方法来实现我的最终目标,但是我想从中获得的是一个可能适用于其他情况的一般方法。

目标:

我有一个csv文件包含600万以上的地理IPlogging。 每个logging总共包含4个字段,文件大小为180mb。

我想处理这个文件,并将每个logging插入一个名为“Blocks”的MongoDB集合中。 每个“块”将有csv文件中的4个字段。

我目前的做法

我正在使用mongoose创build一个“块”模型和一个ReadStream来逐行处理文件。 我正在使用的代码来处理文件和提取logging工程,我可以打印每个logging到控制台,如果我想。

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

这是每次读取和分析行时被调用的函数内部的代码。 “rec”variables包含一个代表文件中单个logging的对象。

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' ); } }); 

问题

由于文件是asynchronous读取的,因此同时处理多行文件,读取文件比MongoDB写入速度快得多,因此整个过程在大约282000条logging处停顿,并且高达5k +并发Mongo连接。 它不会崩溃,它只是坐在那里什么都不做,似乎没有恢复,在蒙戈收集的项目也没有进一步上升。

我在这里之后是解决这个问题的一般方法。 我将如何限制并发Mongo连接的数量? 我想利用能够同时插入多个logging,但我错过了一个方法来调节stream量。

先谢谢你。

我会尝试从Mongodb的命令行CSV导入选项 – 它应该做你以后,而不必写任何代码

不是从.csv文件导入确切情况的答案,而是在进行批量插入(s)

– >首先没有特殊的“批量”插入操作,其全部为每个到底。

– >如果你尝试读取一个asynchronous的大文件,这会比写入过程快得多,那么你应该考虑改变你的方法,首先要弄清楚你的设置能处理多less,(或者只是打-n -trial)。

—>之后,改变你从文件中读取的方式,你不需要从文件中读取每一行,async-ly,学习等待,使用forEach,从Async.js forEachSeries将你的读取降低到mongodb写入级别,你很好去。