Użycie bufora danych w etapie sortowania przepełnienia przekracza wewnętrzny limit
Używając kodu:
all_reviews = db_handle.find().sort('reviewDate', pymongo.ASCENDING)
print all_reviews.count()
print all_reviews[0]
print all_reviews[2000000]
Liczba drukuje {[1] } i drukuje all_reviews[0]
.
Jednak przy drukowaniu all_reviews[2000000]
dostaję błąd:
Pymongo.błędy.33554495 bajtów przekracza wewnętrzny limit 33554432 bajtówJak sobie z tym poradzić?
6 answers
Masz limit 32MB na sortowaniu w pamięci:
Https://docs.mongodb.com/manual/reference/limits/#Sort-Operations
Dodaj indeks do pola sortowania. Dzięki temu MongoDB może przesyłać strumieniowo dokumenty w kolejności posortowanej, zamiast próbować załadować je wszystkie do pamięci na serwerze i posortować je w pamięci przed wysłaniem do klienta.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-22 12:01:18
Jak powiedział kumar_harsh
w sekcji komentarzy, chciałbym dodać kolejny punkt.
Możesz wyświetlić bieżące użycie bufora używając poniższego polecenia nad bazą danych admin
:
> 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 bufora, więc możesz zwiększyć limit bufora o własną zdefiniowaną optymalną wartość, 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 mongodb plik konfiguracyjny:
setParameter=internalQueryExecMaxBlockingSortBytes=309715200
Mam nadzieję, że to pomoże !!!
Note
:to polecenie obsługuje tylko po wersji 3.0 +
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-31 05:18:58
Rozwiązane z indeksowaniem
db_handle.ensure_index([("reviewDate", pymongo.ASCENDING)])
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-19 18:17:19
Jeśli chcesz uniknąć tworzenia indeksu (np. po prostu chcesz szybko i brudnie sprawdzić, aby zbadać dane), możesz użyć agregacji z użyciem dysku:
all_reviews = db_handle.aggregate([{$sort: {'reviewDate': 1}}], {allowDiskUse: true})
[[1]}(Nie wiem, jak to zrobić w pymongo, choć).Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-23 12:50:30
Składnia JavaScript API dla indeksu:
db_handle.ensureIndex({executedDate: 1})
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-02 10:23:39
W moim przypadku konieczne było poprawienie indeksów nessary w kodzie i odtworzenie ich:
rake db:mongoid:create_indexes RAILS_ENV=production
Ponieważ przepełnienie pamięci nie występuje, gdy wymagany jest 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 } )
Mogą być również potrzebne 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() } )
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-18 21:28:02