2014-12-03 18 views
9

Sto correndo l'errore aggregation result exceeds maximum document size (16MB) con l'aggregazione mongodb utilizzando pymongo.Impossibile ottenere allowDiskUse: True per funzionare con pymongo

Sono stato in grado di superarlo inizialmente utilizzando l'opzione limit(). Tuttavia, ad un certo punto ho avuto la

Exceeded memory limit for $group, but didn't allow external sort. Pass allowDiskUse:true to opt in." error. 

Ok, userò l'opzione {'allowDiskUse':True}. Questa opzione funziona quando lo uso sulla riga di comando, ma quando ho provato ad usare nel mio codice python

result = work1.aggregate(pipe, 'allowDiskUse:true') 

ottengo TypeError: aggregate() takes exactly 2 arguments (3 given) errore. (nonostante la definizione data a http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.aggregate: aggregato (pipeline, ** kwargs)).

Ho cercato di usare EseguiComando, o piuttosto è pymongo equivalenti:

db.command('aggregate','work1',pipe, {'allowDiskUse':True}) 

ma ora sono tornato al 'risultato dell'aggregazione superi dimensione massima del documento (16 MB)' errore

Nel caso in cui bisogno di sapere

pipe = [{'$project': {'_id': 0, 'summary.trigrams': 1}}, {'$unwind': '$summary'}, {'$unwind': '$summary.trigrams'}, {'$group': {'count': {'$sum': 1}, '_id': '$summary.trigrams'}}, {'$sort': {'count': -1}}, {'$limit': 10000}] 

Grazie

risposta

24

Così, in ordine:

  • aggregate è un metodo. Sono necessari 2 argomenti posizionali (self, che è passato implicitamente e pipeline) e un numero qualsiasi di argomenti parola chiave (che deve essere passato come foo=bar - se non c'è il segno =, non è un argomento parola chiave). Ciò significa che è necessario chiamare result = work1.aggregate(pipe, allowDiskUse=True).

  • L'errore relativo alla dimensione massima del documento è inerente a Mongo. Mongo non può mai restituire un documento (o una sua matrice) più grande di 16 megabyte. Non posso dirti perché, perché non ci hai fornito né i tuoi dati né il tuo codice, ma probabilmente significa che il documento che stai creando come risultato finale è troppo grande. Prova a diminuire il parametro $limit, forse? Inizia impostandolo su 1, esegui un test, quindi aumentalo e guarda quanto grande diventa il risultato quando lo fai.

+2

>> work1.aggregate (pipe, allowDiskUse = True). Questo ha fatto il trucco, perfetto, grazie –

+0

@Max Noel Dopo aver aggiunto 'allowDiskUse = True', non vedo più il problema del limite di 16mb con la dimensione di bson, tuttavia ho ottenuto un errore di dimensione dal lato di pymongo:' raise DocumentTooLarge ("documento di comando troppo grande") pymongo.errors.DocumentTooLarge: documento di comando troppo grande' Hai provato questo? – Sam

Problemi correlati