Comment augmenter la limite de données en mémoire tampon?

16

Dans Ubuntu, j'ai créé une collection MongoDB Db contenant 1 million d'enregistrements, et lorsque j'essaie d'exécuter une commande de tri contre, j'obtiens l'erreur suivante:

 "$err" : "Runner error: Overflow sort stage buffered data usage of 33555002 bytes exceeds internal limit of 33554432 bytes",
 "code" : 17144

S'il vous plaît quelqu'un peut-il décrire comment augmenter la limite interne afin que je puisse exécuter cela et d'autres commandes à grande échelle contre les données?

Jon295087
la source
Je doute que vous le puissiez. Le problème vient probablement de votre déclaration: EXPLAIN montre-t-il que vous utilisez un INDEX? Sinon, vous devez ajouter un INDEX à votre table.
Rinzwind
Salut Rinzwind. J'essaie de comparer les performances, donc je cherche à exécuter des sortes de données en utilisant noindex, un index principal et un index secondaire. Suggérez-vous qu'il n'est pas possible d'exécuter une sorte de cette échelle sans index?
Jon295087
Ah. Eh bien, j'ai tendance à examiner les performances en utilisant EXPLAIN (dès que EXPLAIN ne me donne pas un faible nombre d'enregistrements, les performances sont mauvaises). Vous devrez probablement limiter vos enregistrements si vous voulez le faire comme ça.
Rinzwind
J'ai trouvé que MongoDB traitera environ 25 000 documents dans cet ensemble de données, mais tombe avec quelque chose de plus grand ... Je suppose que c'est juste une limitation de la base de données? Merci pour vos commentaires.
Jon295087

Réponses:

23

Cela peut se produire à cause d'un bogue comme SERVER-13611 (alors assurez-vous que vous êtes sur la dernière version), ou parce que vous essayez de trier sur un index clairsemé en 2.6 , mais plus généralement c'est parce que vous essayez simplement de trier aussi de nombreux enregistrements en mémoire sans index.

La limite spécifique que vous atteignez est intentionnelle et est documentée ici - elle ne peut pas être modifiée, vous devez donc réduire l'ensemble des résultats ou utiliser un index, etc. pour effectuer le tri.

Mise à jour (novembre 2014): la prochaine version 2.8 (2.8.0-rc0 au moment de la rédaction de cet article) permet désormais de modifier ce paramètre, comme suit:

db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes: <limit in bytes>})

La valeur par défaut est 32 Mo (33554432 octets) et doit être ajustée avec soin - les grands tris en mémoire peuvent entraîner l'arrêt de votre base de données (c'est pourquoi il y avait une limite en premier lieu).

Adam C
la source
"errmsg": "aucune option trouvée pour définir, utilisez l'aide: true pour voir les options"
Mohammad Efazati
1
vous utilisez probablement une version très différente de celle à laquelle cette réponse était destinée, cela a été écrit il y a un certain temps déjà
Adam C
2

J'ai également rencontré le problème lors du tri et de la pagination des enregistrements 200K +. La solution la plus simple semble être d'ajouter un index (pour les attributs que vous triez.

max kaplan
la source