Maison > Questions et réponses > le corps du texte
听说mongodb的MapReduce是单线程的,性能很差,这是怎么回事?差到什么程度呢??有哪位大侠能说说原理。
PHP中文网2017-04-21 11:18:15
Je ne sais pas si l'exécution à l'intérieur est monothread, mais s'il s'agit d'un environnement de production, il est préférable de ne pas accéder directement aux résultats de mapReduce à chaque fois. En fonction de la taille des données, cela prendra quand même. un certain laps de temps. Nos données se comptent en dizaines de millions et chaque exécution de mapReduce prend environ 5 à 6 secondes. Heureusement, notre application n'est pas très en temps réel. Donc, fondamentalement, les données sont mises en cache pendant 2 heures, puis mapReduce est exécuté pour obtenir les derniers résultats.
ringa_lee2017-04-21 11:18:15
Je pense que cet article expliquera les problèmes de performances de mongodb !
http://stackoverflow.com/questions/39...
伊谢尔伦2017-04-21 11:18:15
J'ai fait des choses similaires avant d'utiliser MapReduce. Parce que cela prenait du temps, je l'ai ensuite modifié pour utiliser une requête agrégée pour les statistiques. L'exemple spécifique est le suivant :
> db.user.findOne()
{
"_id" : ObjectId("557a53e1e4b020633455b898"),
"accountId" : "55546fc8e4b0d8376000b858",
"tags" : [
"金牌会员",
"钻石会员",
"铂金会员",
"高级会员"
]
}
Le modèle de document de base est comme ci-dessus, j'ai indexé sur accountId et tags
db.user.ensureIndex({"accountId":1, "tags":1})
Maintenant, il est nécessaire de compter les balises sous l'utilisateur. MapReduce est conçu comme suit :
var mapFunction = function() {
if(this.tags){
for (var idx = 0; idx < this.tags.length; idx++) {
var tag = this.tags[idx];
emit(tag, 1);
}
}
};
var reduceFunction = function(key, values) {
var cnt=0;
values.forEach(function(val){ cnt+=val;});
return cnt;
};
db.user.mapReduce(mapFunction,reduceFunction,{out:"mr1"}) //输出到集合mr1中
Résultat :
> db.mr1.find().pretty()
{ "_id" : "金牌会员", "value" : 9000 }
{ "_id" : "钻石会员", "value" : 43000 }
{ "_id" : "铂金会员", "value" : 90000 }
{ "_id" : "铜牌会员", "value" : 3000 }
{ "_id" : "银牌会员", "value" : 5000 }
{ "_id" : "高级会员", "value" : 50000 }
Il semble avoir atteint notre effet. Je viens d'utiliser une petite quantité de données 10W pour faire le test ci-dessus. Pendant le processus d'exécution, il affichera :
> db.mapReduceTest.mapReduce(mapFunction,reduceFunction,{out:"mr1"})
{
"result" : "mr1",
"timeMillis" : 815, //耗时多久
"counts" : {
"input" : 110000, //扫描的文档数量
"emit" : 200000, //mongo执行计算的次数
"reduce" : 2001,
"output" : 6
},
"ok" : 1
}
Parce que les données de ma simulation sont relativement simples et régulières, on peut voir que le nombre de calculs est presque deux fois supérieur au nombre de documents numérisés. Plus tard, j'ai utilisé des données aléatoires pour les tests et j'ai découvert que les résultats étaient encore pires. J'ai définitivement abandonné l'implémentation de MapReduce et j'ai changé l'utilisation d'autres implémentations.