Jak zwiększyć limit buforowanych danych?

16

W Ubuntu stworzyłem kolekcję MongoDB Db zawierającą 1 milion rekordów, a gdy próbuję uruchomić przeciwko niej polecenie sortowania, pojawia się następujący błąd:

 "$err" : "Runner error: Overflow sort stage buffered data usage of 33555002 bytes exceeds internal limit of 33554432 bytes",
 "code" : 17144

Czy ktoś może opisać, jak zwiększyć limit wewnętrzny, abym mógł wykonać to i kilka innych dużych poleceń przeciwko danym?

Jon295087
źródło
Wątpię, czy potrafisz. Problem prawdopodobnie dotyczy twojego stwierdzenia: czy EXPLAIN pokazuje, że używasz INDEKSU? Jeśli nie, musisz dodać INDEKS do swojego stołu.
Rinzwind
Cześć Rinzwind. Próbuję porównać wydajność, więc szukam, aby uruchomić sortowanie danych przy użyciu noindex, indeksu podstawowego i indeksu dodatkowego. Sugerujesz, że nie można uruchomić takiej skali bez indeksu?
Jon295087
Ach Cóż, mam tendencję do sprawdzania wydajności za pomocą EXPLAIN (jak tylko EXPLAIN nie daje mi niskiej liczby rekordów, wydajność jest zła). Prawdopodobnie będziesz musiał ograniczyć swoje rekordy, jeśli chcesz to zrobić w ten sposób.
Rinzwind
Przekonałem się, że MongoDB przetworzy około 25 000 dokumentów w tym zbiorze danych, ale przewyższa wszystko, co większe ... Myślę, że to tylko ograniczenie bazy danych? Dziękuję za twoje komentarze.
Jon295087

Odpowiedzi:

23

Może się to zdarzyć z powodu błędu, takiego jak SERVER-13611 (więc upewnij się, że korzystasz z najnowszej wersji) lub ponieważ próbujesz sortować według rzadkiego indeksu w wersji 2.6 , ale częściej dzieje się tak, ponieważ po prostu próbujesz sortować zbyt wiele zapisów w pamięci bez indeksu.

Konkretny limit, który osiągasz, jest celowy i jest tutaj udokumentowany - nie można go zmienić, więc musisz zmniejszyć zestaw wyników lub użyć indeksu itp., Aby wykonać sortowanie.

Aktualizacja (listopad 2014 r.): Nadchodzące wydanie 2.8 (2.8.0-rc0 w chwili pisania tego tekstu) umożliwia teraz dostosowanie tego ustawienia w następujący sposób:

db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes: <limit in bytes>})

Wartość domyślna to 32 MB (33554432 bajty) i należy ją ostrożnie dostosowywać - duże sortowanie w pamięci może spowodować zatrzymanie bazy danych (dlatego na pierwszym miejscu był limit).

Adam C.
źródło
„errmsg”: „nie znaleziono opcji do ustawienia, skorzystaj z pomocy: prawda, aby zobaczyć opcje”
Mohammad Efazati
1
prawdopodobnie używasz zupełnie innej wersji niż ta, do której przeznaczona była ta odpowiedź, została napisana całkiem dawno temu
Adam C
2

Wpadłem również na ten problem podczas sortowania i paginowania rekordów o wielkości ponad 200 000. Najłatwiejszym rozwiązaniem wydaje się dodanie indeksu (dla sortowanych atrybutów).

max kaplan
źródło