MongoDB bulk.execute() 无序插入花费太多时间
MongoDB bulk.execute() taking too much time to insert unordered
我正在尝试为 mongoDB(版本 3.2.4)提供来自 google ngram 的弧线,但即使配置得当(MBP Mid 2014,2.2 GHz)也花费了太多时间英特尔酷睿 i7,16gb)。
对于原始文件中 890 万行中的每一行,我都创建了一个 doc
和 bulk.insert(doc);
到一个无序的批量中。
插入其中的 500 个后,我执行 bulk.execute()
并重复此过程,直到将它们全部添加到数据库中,但这种情况从未发生过,因为每千个文档的插入时间超过一分钟,并且我肯定没有 8,9k 分钟等待它。
代码如下:
MongoClient.connect(url, function (err, db) {
if (err) {
console.log('Unable to connect to the mongoDB server. Error:', err);
} else {
//connected
console.log('Connection established to', url);
var bulk = db.collection('bigrams').initializeUnorderedBulkOp();
const rl = readline.createInterface({
input: fs.createReadStream(path+filename)
});
rl.on('line', function (line) {
var stringArray = line.split("\t");
var firstPart = stringArray[0]+'\t'+stringArray[1]+'\t'+stringArray[2]+"\t";
var head_token = stringArray[0];
var syntatic_ngram = stringArray[1].split(" ");
var total_count = stringArray[2];
var counts_by_year = line.replace(firstPart,'').split("\t");
var doc = {
"head token" : head_token,
"syntatic ngram" : syntatic_ngram,
"total count" : total_count,
"counts by year" : counts_by_year
};
count++;
bulkCount++;
if (bulkCount == bulkSize) {
console.log("BulkSize reached. Executing...");
bulk.execute();
bulkCount = 0;
}
console.log("bulk inserted count:"+count);
bulk.insert(doc);
});
rl.on('end', function(){
bulk.execute();
db.close();
});
}
});
P.S.: 前 10k 个插入,即前 20 个 bulk.execute()
是非常快的进程 <1m。之后处理时间会增加。 ):
有什么建议吗?谢谢。
我从mongoDBdocumentation那里得到了答案:"After execution, you cannot re-execute the Bulk() object without reinitializing."
我刚刚在 bulk.execute();
之后添加了 bulk = db.collection('bigrams').initializeUnorderedBulkOp();
并且插入时间是恒定的。几分钟后,所有内容都已插入。
希望这对其他人有帮助。 (:
我正在尝试为 mongoDB(版本 3.2.4)提供来自 google ngram 的弧线,但即使配置得当(MBP Mid 2014,2.2 GHz)也花费了太多时间英特尔酷睿 i7,16gb)。
对于原始文件中 890 万行中的每一行,我都创建了一个 doc
和 bulk.insert(doc);
到一个无序的批量中。
插入其中的 500 个后,我执行 bulk.execute()
并重复此过程,直到将它们全部添加到数据库中,但这种情况从未发生过,因为每千个文档的插入时间超过一分钟,并且我肯定没有 8,9k 分钟等待它。
代码如下:
MongoClient.connect(url, function (err, db) {
if (err) {
console.log('Unable to connect to the mongoDB server. Error:', err);
} else {
//connected
console.log('Connection established to', url);
var bulk = db.collection('bigrams').initializeUnorderedBulkOp();
const rl = readline.createInterface({
input: fs.createReadStream(path+filename)
});
rl.on('line', function (line) {
var stringArray = line.split("\t");
var firstPart = stringArray[0]+'\t'+stringArray[1]+'\t'+stringArray[2]+"\t";
var head_token = stringArray[0];
var syntatic_ngram = stringArray[1].split(" ");
var total_count = stringArray[2];
var counts_by_year = line.replace(firstPart,'').split("\t");
var doc = {
"head token" : head_token,
"syntatic ngram" : syntatic_ngram,
"total count" : total_count,
"counts by year" : counts_by_year
};
count++;
bulkCount++;
if (bulkCount == bulkSize) {
console.log("BulkSize reached. Executing...");
bulk.execute();
bulkCount = 0;
}
console.log("bulk inserted count:"+count);
bulk.insert(doc);
});
rl.on('end', function(){
bulk.execute();
db.close();
});
}
});
P.S.: 前 10k 个插入,即前 20 个 bulk.execute()
是非常快的进程 <1m。之后处理时间会增加。 ):
有什么建议吗?谢谢。
我从mongoDBdocumentation那里得到了答案:"After execution, you cannot re-execute the Bulk() object without reinitializing."
我刚刚在 bulk.execute();
之后添加了 bulk = db.collection('bigrams').initializeUnorderedBulkOp();
并且插入时间是恒定的。几分钟后,所有内容都已插入。
希望这对其他人有帮助。 (: