2011-01-12 16 views
121

Da MongoDB The Definitive Guide:MongoDB BSON limite di dimensione dei documenti intesa

documenti più grandi di 4MB (se convertito in BSON) non possono essere salvati nel database. Questo è un limite un po 'arbitrario (e potrebbe essere generato in futuro); serve principalmente a prevenire la progettazione di uno schema errato e garantisce prestazioni uniformi .

non capisco questo limite, questo significa che un documento contenente un post sul blog con un sacco di commenti, che così succede di essere più grande di 4MB non può essere memorizzato come un unico documento?

Questo conta anche i documenti nidificati?

E se volessi un documento che controlli le modifiche ad un valore. (Alla fine potrebbe crescere, superando il limite di 4 MB.)

Spero che qualcuno lo spieghi correttamente.

Ho appena iniziato a leggere su MongoDB (il primo database nosql che sto imparando).

Grazie.

+5

Penso che la domanda dovrebbe chiarire che questa è una limitazione delle dimensioni dei documenti memorizzati MongoDB e non di formato BSON. – alexpopescu

+2

@alexpopescu, hai ragione. – saint

+2

Tuttavia, ho appena provato a salvare un documento enorme che sicuramente supera i 4 MB per ottenere il messaggio "BSON :: InvalidDocument: Documento troppo grande: i documenti BSON sono limitati a 4194304 byte". Se questo è il caso, non è tipo di fuorviante nel messaggio di avviso/errore? –

risposta

108

Prima di tutto, questo in realtà è cresciuto nella prossima versione di 8MB o 16MB ... ma penso che a mettere questo in prospettiva, Eliot da 10gen (che ha sviluppato MongoDB) lo mette meglio:

EDIT :la dimensione è stata officially 'sollevato' per 16MB

Così, il vostro esempio blog, 4MB è in realtà un bel po '.. per esempio, l'u completo testo ncompresses di "La guerra dei mondi" è solo 364k (html): http://www.gutenberg.org/etext/36

Se il tuo post sul blog è che a lungo con che molti commenti, io per primo non sono intenzione di leggerlo :)

per i riferimenti, se dedicato 1MB a loro, si potrebbe facilmente avere più di 10k (probabilmente più vicino a 20k)

Dunque, salvo veramente bizzarre situazioni, sarà grande lavoro. E in il caso di eccezione o lo spam, io davvero non penso che tu voglia un oggetto 20mb comunque.Penso che limitare i trackback come 15k o così non abbia molto senso che lo sia importante per le prestazioni. O al involucro meno speciale se mai si verifica .

-Eliot

penso che sarebbe pigiato piuttosto difficile da raggiungere il limite ... e nel corso del tempo, se si aggiorna ... ti devi preoccupare meno.

Il punto principale del limite è così non si utilizza tutta la RAM sul vostro server (come è necessario per caricare tutti MB s del documento nella RAM quando si esegue una query di esso.)

Quindi il limite è circa il% della normale RAM utilizzabile su un sistema comune ... che continuerà a crescere anno dopo anno.

Nota sulla memorizzazione dei file in MongoDB

Se avete bisogno di memorizzare i documenti (o file) più grandi di 16MB è possibile utilizzare il GridFS API che romperà automaticamente il backup dei dati in segmenti e li lo streaming di nuovo voi (evitando il problema con limiti di dimensione/RAM.)

Invece di memorizzare un file in un unico documento, GridFS divide il file in parti o pezzi, e memorizza ogni blocco da un documento separato.

GridFS utilizza due raccolte per memorizzare i file. Una raccolta memorizza i blocchi di file e gli altri archivi memorizzano i metadati.

È possibile utilizzare questo metodo per memorizzare immagini, file, video, ecc. Nel database come si potrebbe in un database SQL. Ho usato questo anche per archiviare file video multi gigabyte.

+0

Non capisco davvero "Il punto principale del limite è che non si usi tutta la RAM sul server". Manteniamo il nostro intero database MongoDB nella RAM, quindi questo è ancora un problema? –

+2

È fantastico avere abbastanza RAM per l'intero database ... In genere il "working set" è nella RAM, non nell'intero database (come nel mio caso ho più di un database x GB dove se tutto sommato supererebbe la mia RAM, ma va bene perché il working set è molto, molto più piccolo.) Inoltre, se non ci fosse un limite, potresti caricare un documento da 800 MB in RAM con una query e un documento da 400k con un altro, rendendo il bilanciamento della RAM un poco complesso, ecc. Quindi il "limite" è una percentuale della RAM tipica del server (quindi cresce nel tempo.) http://www.mongodb.org/display/DOCS/Checking+Server+Memory+ Utilizzo –

+3

È fantastico poter archiviare tutto nella RAM, ma considerare l'efficienza e l'idioma del post del blog. Ovviamente vuoi che un messaggio sia in memoria se è letto. Ma vuoi veramente che 10 pagine di commenti per un post siano in memoria quando la maggior parte delle persone non leggerà mai oltre la prima pagina? Certo, puoi farlo e se il tuo database è abbastanza piccolo da poter essere inserito nella memoria, allora nessun problema. Ma in termini di pura efficienza, non vuoi che i bit inutili occupino spazio di memoria se puoi evitarlo (e questo vale anche per RDBMS). – AlexGad

1

Forse memorizzare un post sul blog -> commenti relazione in un database non relazionale non è davvero il miglior design.

Probabilmente dovresti comunque archiviare i commenti in una raccolta separata per i post dei blog.

[modifica]

Vedi commenti qui sotto per ulteriori discussioni.

+0

Non conosciamo il miglior design in questa fase iniziale dell'esperienza. Il libro dà un piccolo esempio di un blog. Da qui il pensiero. Grazie. – saint

+14

Non sono affatto d'accordo. I commenti nei tuoi post sul blog dovrebbero essere perfettamente a posto in MongoDB ... è un uso molto comune (lo uso più di un posto in produzione e funziona piuttosto bene.) –

+0

@Justin Jenkins: sono d'accordo con te ma dipende molto dal sito. Quindi credo che per siti come StackOverflow sia necessario creare un documento separato per i commenti. –

24

Molti nella comunità preferirebbe senza limiti con avvertimenti circa le prestazioni, vedere questo commento per un argomento ben ragionata: https://jira.mongodb.org/browse/SERVER-431?focusedCommentId=22283&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-22283

Il mio introito, gli sviluppatori di piombo sono testardi su questo problema perché hanno deciso che era un importante "funzionalità" presto. Non lo cambieranno in qualsiasi momento presto perché i loro sentimenti sono feriti che qualcuno l'ha interrogato. Un altro esempio di personalità e politica che distacca da un prodotto nelle comunità open source, ma questo non è davvero un problema paralizzante.

+2

Sono totalmente d'accordo con te, inoltre sconfigge lo scopo di avere documenti incorporati ora, poiché la maggior parte dei documenti incorporati ora supererà facilmente il limite. Esp con matrice di documenti al loro interno –

+0

@ marr75 dice ora riparato, è stato corretto? – Mafii

+0

Voglio dire, il limite è stato aumentato a 16 MB, che non risolve il "problema" a lungo termine; IMO il limite dovrebbe essere eliminato. – marr75

3

Non ho ancora riscontrato un problema con il limite che non riguardava file di grandi dimensioni memorizzati all'interno del documento stesso. Esistono già numerosi database che sono molto efficienti nella memorizzazione/nel recupero di file di grandi dimensioni; sono chiamati sistemi operativi. Il database esiste come livello sul sistema operativo. Se si sta utilizzando una soluzione NoSQL per motivi di prestazioni, perché si desidera aggiungere ulteriore overhead di elaborazione all'accesso dei dati inserendo il livello DB tra l'applicazione ei dati?

JSON è un formato di testo. Pertanto, se si accede ai dati tramite JSON, ciò è particolarmente vero se si dispone di file binari perché devono essere codificati in uuencode, esadecimale o Base 64.Il percorso di conversione potrebbe essere simile

file binario <> JSON (codificato) <> BSON (codificato)

Sarebbe più efficace per mettere il percorso (URL) per il file di dati nel documento e mantenere la dati stessi in binario.

Se si desidera mantenere questi file di lunghezza sconosciuta nel DB, sarebbe probabilmente meglio inserirli in GridFS e non rischiare di uccidere la concorrenza quando si accede ai file di grandi dimensioni.

+1

"Esistono già numerosi database che sono molto efficienti nella memorizzazione e nel recupero di file di grandi dimensioni, sono chiamati sistemi operativi."; Vedi http://blog.mongodb.org/post/183689081/storing-large-objects-and-files-in-mongodb – redcalx

18

Per inviare una risposta di chiarimento qui per coloro che vengono indirizzati qui da Google.

le dimensioni del documento include tutto nel documento inclusi i documenti secondari, oggetti nidificati ecc

Così un documento di:

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

ha una dimensione massima di 16meg.

Gli strumenti secondari e gli oggetti nidificati vengono contati per le dimensioni del documento.

5

profondità nidificati per BSON Documenti: MongoDB supporta non più di 100 livelli di nidificazione per i documenti BSON.

More more info vist

Problemi correlati