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ów
Jak sobie z tym poradzić?
Author: William Price, 2014-11-19

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.

 120
Author: A. Jesse Jiryu Davis,
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 +

 46
Author: JERRY,
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)])
 25
Author: sheetal_158,
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ć).
 15
Author: poroszd,
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})
 3
Author: wytten,
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() } )
 2
Author: shilovk,
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