2014-12-03 5 views
9

Występuje błąd aggregation result exceeds maximum document size (16MB) z agregacją mongodb za pomocą pymongo.Nie można uzyskać allowDiskUse: True do pracy z pymongo

Udało mi się go pokonać na początku przy użyciu opcji limit(). Jednak w pewnym momencie Dostałem

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

Ok, będę korzystać z opcji {'allowDiskUse':True}. Opcja ta działa, gdy używam go w linii poleceń, ale kiedy próbowałem używać w moim kodu Pythona

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

uzyskać TypeError: aggregate() takes exactly 2 arguments (3 given) błąd. (to pomimo definicji podanej pod http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.aggregate: agregacja (potok, ** kwargs)).

Próbowałem użyć RunCommand, czy raczej to pymongo równoważne:

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

ale teraz jestem z powrotem do „wyniku agregacji przekracza maksymalny rozmiar dokumentu (16MB)” Błąd

W przypadku trzeba wiedzieć

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

Dziękuję

Odpowiedz

24

Więc w kolejności:

  • aggregate to metoda. Zajmuje 2 argumenty pozycyjne (self, które są niejawnie przekazywane, i pipeline) oraz dowolną liczbę argumentów słów kluczowych (które muszą być przekazane jako foo=bar - jeśli nie ma znaku =, to nie jest argument słowa kluczowego). Oznacza to, że musisz zadzwonić pod numer result = work1.aggregate(pipe, allowDiskUse=True).

  • Twój błąd dotyczący maksymalnego rozmiaru dokumentu jest nieodłączny dla Mongo. Mongo nie może nigdy zwrócić dokumentu (lub jego tablicy) większego niż 16 megabajtów. Nie mogę powiedzieć dlaczego, ponieważ nie podałeś nam ani danych, ani kodu, ale prawdopodobnie oznacza to, że dokument, który budujesz jako wynik końcowy, jest zbyt duży. Spróbuj zmniejszyć parametr $limit? Zacznij od ustawienia na 1, uruchom test, następnie zwiększ go i sprawdź, jak duży jest wynik, gdy to zrobisz.

+2

>> work1.aggregate (pipe, allowDiskUse = True). Zrobiło to triumf, idealnie, dziękuję –

+0

@Max Noel Po dodaniu 'allowDiskUse = True' nie widzę już problemu z limitem limitu rozmiaru 16mb, jednak dostałem inny błąd rozmiaru ze strony pymongo:' raise DocumentTooLarge ("zbyt duży dokument polecenia") pymongo.errors.DocumentTooLarge: zbyt duży dokument polecenia "Czy doświadczyłeś tego? – Sam