167 votes

Comprendre la limite de taille des documents BSON de MongoDB

De MongoDB The Definitive Guide :

Les documents de plus de 4 Mo (lorsqu'ils sont convertis en BSON) ne peuvent pas être enregistrés dans la base de données. Il s'agit d'une limite quelque peu arbitraire (qui pourrait être augmentée à l'avenir). être augmentée à l'avenir) ; il s'agit surtout d'éviter une mauvaise conception des schémas et d'assurer des des performances cohérentes.

Je ne comprends pas cette limite, est-ce que cela signifie qu'un document contenant un article de blog avec beaucoup de commentaires qui se trouve être plus grand que 4MB ne peut pas être stocké comme un seul document ?

Les documents imbriqués sont-ils également pris en compte ?

Et si je voulais un document qui vérifie les changements apportés à une valeur. (Il finira par grossir, dépassant la limite de 4MB).

J'espère que quelqu'un expliquera cela correctement.

Je viens de commencer à lire sur MongoDB (première base de données nosql sur laquelle je me renseigne).

Merci.

6 votes

Je pense que la question devrait préciser qu'il s'agit d'une limitation de la taille des documents stockés dans MongoDB et non du format BSON.

3 votes

Pourtant, je viens d'essayer d'enregistrer un énorme document qui dépasse très certainement les 4 Mo pour obtenir le message "BSON::InvalidDocument : Document trop grand : Les documents BSON sont limités à 4194304 octets". Si c'est le cas, le message d'avertissement/d'erreur n'est-il pas un peu trompeur ?

25 votes

Vous pouvez facilement trouver la taille maximale de votre document BSON avec db.isMaster().maxBsonObjectSize/(1024*1024)+' MB' dans mongo coquille.

137voto

Justin Jenkins Points 10501

Tout d'abord, cette question est en fait soulevée dans la prochaine version pour 8MB o 16MB ... mais je pense que pour mettre tout cela en perspective, c'est Eliot de 10gen (qui a développé MongoDB) qui le dit le mieux :

EDITAR: La taille a été officiellement élevé" à 16MB

Donc, sur votre exemple de blog, 4MB est en fait beaucoup Par exemple, le texte complet non compressé de "La guerre des des mondes" est seulement 364k (html) : http://www.gutenberg.org/etext/36

Si ton article de blog est si long avec de commentaires, je ne vais pas le lire ne le lirai pas :)

Pour les trackbacks, si vous leur consacrez 1MB à eux, vous pourriez facilement avoir plus de plus de 10k (probablement plus proche de 20k)

Donc, sauf pour les situations vraiment bizarres des situations vraiment bizarres, ça marchera très bien. Et dans l'exception du cas ou du spam, je n'ai vraiment que vous ne voudriez pas d'un objet de 20mb de toute façon. Je pense que plafonner les trackbacks à 15k ou plus, ça a beaucoup de sens, peu importe quoi que ce soit pour les performances. Ou au moins au moins une enveloppe spéciale si jamais cela arrive.

-Eliot

Je pense que vous aurez du mal à atteindre la limite ... et avec le temps, si vous mettez à niveau ... vous aurez à vous inquiéter de moins en moins.

L'objectif principal de cette limite est de ne pas utiliser toute la mémoire vive de votre serveur (car vous devez charger toutes les données de l MB du document dans la RAM lorsque vous l'interrogez).

La limite est donc d'un certain pourcentage de la RAM normalement utilisable sur un système commun... qui ne cessera d'augmenter d'année en année.

Note sur le stockage des fichiers dans MongoDB

Si vous avez besoin de stocker des documents (ou des fichiers) plus volumineux que 16MB vous pouvez utiliser le API GridFS qui décomposera automatiquement les données en segments et vous les transmettra en continu (évitant ainsi le problème des limites de taille/RAM).

Au lieu de stocker un fichier dans un seul document, GridFS divise le fichier en parties, ou chunks, et stocke chaque chunk comme un document séparé.

GridFS utilise deux collections pour stocker les fichiers. Une collection stocke les morceaux de fichiers, et l'autre stocke les métadonnées des fichiers.

Vous pouvez utiliser cette méthode pour stocker des images, des fichiers, des vidéos, etc. dans la base de données, comme vous le feriez dans une base de données SQL. J'ai même utilisé cette méthode pour stocker des fichiers vidéo de plusieurs gigaoctets.

0 votes

Je ne comprends pas vraiment "Le but principal de la limite est de ne pas utiliser toute la RAM de votre serveur". Nous conservons l'intégralité de notre base de données MongoDB dans la RAM, est-ce encore un problème ?

4 votes

C'est génial que vous ayez assez de RAM pour l'ensemble de votre base de données ... Typiquement, le "working set" est dans la RAM, pas la base de données entière (comme dans mon cas, j'ai plus d'un x GBs de bases de données qui, si elles étaient toutes additionnées, dépasseraient ma RAM, mais ce n'est pas grave parce que le working set est beaucoup, beaucoup plus petit). En outre, s'il n'y avait pas de limite, vous pourriez charger un document de 800 Mo dans la RAM avec une requête et un document de 400 000 avec une autre, ce qui rendrait l'équilibre de votre RAM un peu difficile, etc. La "limite" est donc un certain % de la RAM typique du serveur (elle augmente donc avec le temps). mongodb.org/display/DOCS/Vérification+Serveur+Memoire+Usage

3 votes

C'est formidable de pouvoir tout stocker en mémoire vive, mais il faut tenir compte de l'efficacité et de l'idiome de l'article de blog. Vous voulez évidemment qu'un billet soit en mémoire s'il est lu. Mais voulez-vous vraiment que 10 pages de commentaires pour un article de blog soient en mémoire alors que la plupart des gens ne dépasseront jamais la première page ? Bien sûr, vous pouvez le faire et si votre base de données est suffisamment petite pour que tout tienne en mémoire, alors pas de problème. Mais en termes d'efficacité pure, vous ne voulez pas que des bits inutiles prennent de l'espace mémoire si vous pouvez l'éviter (et cela vaut également pour les SGBDR).

37voto

marr75 Points 4127

De nombreux membres de la communauté préféreraient qu'il n'y ait pas de limite avec des avertissements sur les performances, voir ce commentaire pour un argument bien raisonné : https://jira.mongodb.org/browse/SERVER-431?focusedCommentId=22283&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-22283

À mon avis, les principaux développeurs s'entêtent sur cette question parce qu'ils ont décidé très tôt qu'il s'agissait d'une "fonctionnalité" importante. Ils ne vont pas la changer de sitôt parce qu'ils sont blessés que quelqu'un la remette en question. Un autre exemple de personnalité et de politique qui nuit à un produit dans les communautés open source, mais ce n'est pas vraiment un problème rédhibitoire.

6 votes

Je suis tout à fait d'accord avec vous, et cela va également à l'encontre de l'objectif d'avoir des documents intégrés maintenant, car la plupart des documents intégrés vont maintenant dépasser la limite facilement. Esp avec un tableau de documents à l'intérieur

0 votes

@marr75 il est dit que c'est réparé maintenant, est-ce que c'est réparé ?

1 votes

Je veux dire que la limite a été portée à 16 Mo, mais que cela ne résout pas le problème à long terme ; je pense que la limite devrait tout simplement être supprimée.

36voto

Sammaye Points 21778

Afficher une réponse de clarification ici pour ceux qui sont dirigés ici par Google.

La taille du document inclut tout ce qui se trouve dans le document, y compris les sous-documents, les objets imbriqués, etc.

Donc un document de :

{
  "_id": {},
  "na": [1, 2, 3],
  "naa": [
    { "w": 1, "v": 2, "b": [1, 2, 3] },
    { "w": 5, "b": 2, "h": [{ "d": 5, "g": 7 }, {}] }
  ]
}

A une taille maximale de 16 MB.

Les sous-documents et les objets imbriqués sont tous comptabilisés dans la taille du document.

1 votes

La plus grande structure possible pouvant être représentée dans BSON est, ironiquement, également la plus compacte. Malgré le fait que MongoDB utilise size_t (64 bits) en interne, la limite de 16 Mo pour la taille du document serait, au mieux, capable de représenter un document contenant un seul tableau contenant lui-même deux millions de NULL.

1 votes

Mes excuses, j'ai ajouté un deuxième commentaire pour aborder/clarifier un autre détail important : lorsque vous dites la taille du document inclut tout ce qui se trouve dans le document qui comprend également le clés . Par exemple {"f": 1} est plus petit de deux octets que {"foo": 1} . Cela peut rapidement s'accumuler si vous ne faites pas attention, bien que la compression moderne sur disque soit utile.

6voto

user2506815 Points 31

Je n'ai pas encore vu de problème avec la limite qui ne concernait pas de gros fichiers stockés dans le document lui-même. Il existe déjà une variété de bases de données qui sont très efficaces pour stocker/récupérer des fichiers volumineux ; on les appelle des systèmes d'exploitation. La base de données existe comme une couche au-dessus du système d'exploitation. Si vous utilisez une solution NoSQL pour des raisons de performance, pourquoi voudriez-vous ajouter des frais de traitement supplémentaires à l'accès à vos données en plaçant la couche de base de données entre votre application et vos données ?

JSON est un format texte. Donc, si vous accédez à vos données via JSON, c'est particulièrement vrai si vous avez des fichiers binaires car ils doivent être encodés en uuencode, en hexadécimal ou en Base 64. Le chemin de conversion pourrait ressembler à

fichier binaire <> JSON (encodé) <> BSON (encodé)

Il serait plus efficace d'indiquer le chemin d'accès (URL) au fichier de données dans votre document et de conserver les données elles-mêmes en binaire.

Si vous voulez vraiment conserver ces fichiers de longueur inconnue dans votre base de données, vous feriez mieux de les placer dans GridFS et de ne pas risquer de tuer votre concurrence lors de l'accès aux gros fichiers.

1 votes

"Il existe déjà une variété de bases de données qui sont très efficaces pour stocker/récupérer des fichiers volumineux ; elles sont appelées systèmes d'exploitation." ; Voir blog.mongodb.org/post/183689081/

1voto

Mchl Points 32343

Peut-être en stockant un article de blog -> commentaires relation dans une base de données non relationnelle n'est pas vraiment la meilleure conception.

De toute façon, vous devriez probablement stocker les commentaires dans une collection distincte de celle des articles de blog.

[modifier]

Voir les commentaires ci-dessous pour une discussion plus approfondie.

0 votes

Je ne sais pas quel est le meilleur design à ce stade précoce de l'expérience. Le livre donne un petit exemple de blog. D'où l'idée. Merci.

15 votes

Je ne suis pas du tout d'accord. Les commentaires dans les documents de vos articles de blog devraient parfaitement convenir à MongoDB ... c'est une utilisation très courante (je l'utilise à plusieurs endroits en production et cela fonctionne très bien).

0 votes

@Justin Jenkins : Je suis d'accord avec vous mais cela dépend vraiment du site. Je pense donc que pour des sites comme stackoverflow, il faut créer un document séparé pour les commentaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X