Korzystanie z kodu:
all_reviews = db_handle.find().sort('reviewDate', pymongo.ASCENDING)
print all_reviews.count()
print all_reviews[0]
print all_reviews[2000000]
Licznik drukuje 2043484
i drukuje all_reviews[0]
.
Jednak podczas drukowania pojawia all_reviews[2000000]
się błąd:
pymongo.errors.OperationFailure: błąd bazy danych: błąd runnera: przepełnienie buforowane użycie danych na etapie sortowania 33554495 bajtów przekracza wewnętrzny limit 33554432 bajtów
Jak sobie z tym radzę?
mongodb
mongodb-query
mongodb-indexes
arkuszowy_158
źródło
źródło
db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes: <limit in bytes>})
. Źródło: askubuntu.com/questions/501937/ ...Jak powiedział
kumar_harsh
w sekcji komentarzy, chciałbym dodać kolejny punkt.Możesz wyświetlić bieżące użycie bufora za pomocą poniższego polecenia w
admin
bazie danych:> use admin switched to db admin > db.runCommand( { getParameter : 1, "internalQueryExecMaxBlockingSortBytes" : 1 } ) { "internalQueryExecMaxBlockingSortBytes" : 33554432, "ok" : 1 }
Ma domyślną wartość 32 MB (33554432 bajtów) W tym przypadku brakuje danych w buforze, więc możesz zwiększyć limit bufora o zdefiniowaną przez siebie optymalną wartość, na przykład 50 MB, jak poniżej:
> db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes:50151432}) { "was" : 33554432, "ok" : 1 }
Możemy również ustawić ten limit na stałe za pomocą poniższego parametru w pliku konfiguracyjnym mongodb:
setParameter=internalQueryExecMaxBlockingSortBytes=309715200
Mam nadzieję że to pomoże !!!
Note
: To polecenie jest obsługiwane tylko po wersji 3.0 +źródło
rozwiązany z indeksowaniem
db_handle.ensure_index([("reviewDate", pymongo.ASCENDING)])
źródło
Jeśli chcesz uniknąć tworzenia indeksu (np. Chcesz po prostu szybko sprawdzić dane), możesz użyć agregacji z wykorzystaniem dysku:
all_reviews = db_handle.aggregate([{$sort: {'reviewDate': 1}}], {allowDiskUse: true})
(Nie wiem jednak, jak to zrobić w pymongo).
źródło
db_handle.aggregate(pipe, allowDiskUse=True)
. Zobacz to pytanie, aby uzyskać więcej informacji!Składnia JavaScript API dla indeksu:
db_handle.ensureIndex({executedDate: 1})
źródło
W moim przypadku konieczne było poprawienie niezbędnych indeksów w kodzie i odtworzenie ich:
Ponieważ przepełnienie pamięci nie występuje, gdy istnieje potrzebny indeks pola.
PS Wcześniej musiałem wyłączyć błędy przy tworzeniu długich indeksów:
# mongo MongoDB shell version: 2.6.12 connecting to: test > db.getSiblingDB('admin').runCommand( { setParameter: 1, failIndexKeyTooLong: false } )
Może być również potrzebny
reIndex
:# mongo MongoDB shell version: 2.6.12 connecting to: test > use your_db switched to db your_db > db.getCollectionNames().forEach( function(collection){ db[collection].reIndex() } )
źródło