2015-12-24 13 views
6

L'app My Meteor acquisisce un file CSV, lo analizza con Baby Parse (Papa Parse per server) e inserisce i dati in una raccolta MongoDB.Perché 24 MB di dati CSV diventano 230 MB nella raccolta MongoDB?

Ogni riga CSV viene inserita come documento. Il file CSV da 24 MB contiene ~ 900.000 righe; quindi, ~ 900.000 documenti nella collezione. Ogni documento ha 5 campi incluso l'ID univoco dei documenti.

Quando uso dataSize() per ottenere la dimensione della raccolta, ricevo il numero 230172976; se non sbaglio, questo numero è in byte; quindi è 230 MB.

Perché sta succedendo questo gigantesco aumento? Come posso risolvere questo?

+3

Fornire righe di esempio per una spiegazione trasparente. –

risposta

6

Questo perché il valore restituito da .dataSize() include i record padding. Si noti inoltre che se i documenti non hanno il campo _id verrà aggiunto e ogni campo _id è 12-byte. Si consiglia di leggere Record Allocation Strategies

Come posso risolvere questo problema:

Utilizzando il comando collMod con il flag noPadding o il metodo db.createCollection() con l'opzione noPadding. Ma non si deve farlo perché, come indicato nel documentation:

Solo impostare noPadding su true per le collezioni i cui carichi di lavoro non hanno le operazioni di aggiornamento che i documenti di causa a crescere, come ad esempio per le collezioni con carichi di lavoro che sono inserto -solo.

Come Pete Garafano menzionato nella comment seguito, questo è applicabile solo il MMAPv1 Storage Engine; che è il motore di archiviazione predefinito in MongoDB 3.0 e tutte le versioni precedenti.

MongoDB 3.2 utilizzare e sarà necessario modificare il motore di archiviazione predefinito per utilizzare tale opzione nel proprio configuration file o utilizzando l'opzione --storageEngine.

+0

È importante notare che questa opzione si applica solo a MMAPv1. In MongoDB 3.2, WiredTiger è lo storageengine predefinito. –