Niedawno skompresowałem swoją kolekcję za pomocą polecenia:
db.<collectionName>.runCommand( "compact" )
A teraz rozmiar mojej kolekcji wydaje się większy niż rozmiar na dysku!
SECONDARY> db.<collectionName>.stats()
{
"ns" : "<databaseName>.<collectionName>",
"count" : 2937359,
"size" : 5681676492, # 5.6 GB
"avgObjSize" : 1934.2805874256433,
"storageSize" : 4292853728, # 4.2 GB
"numExtents" : 2,
"nindexes" : 2,
"lastExtentSize" : 2146426864,
"paddingFactor" : 1.669999999836597,
"flags" : 1,
"totalIndexSize" : 220735648,
"indexSizes" : {
"_id_" : 162326304,
"e_1_" : 58409344
},
"ok" : 1
}
Nie rozumiem, jak to jest możliwe. Czy wszystkie kolekcje mongodb nie są zawsze wspierane przez dysk?
Czy ktoś może wyjaśnić te wyniki?
validate
?Odpowiedzi:
storageSize
jest sumą wszystkich zakresów dla tych danych, z wyłączeniem indeksów.Tak więc kolekcja zajmuje 2 zakresy, każdy ma ~ 2 GB, a więc ~ 4 GB.
size
zawiera indeksy i uważam, że kilka innych rzeczy, które zawyżają liczbę. Żaden z nich tak naprawdę nie reprezentuje właściwego rozmiaru dysku. Rozmiar dyskudb.stats()
ma pole rozmiaru pliku, które jest bliższe temu, czego chcesz. Myślę, że szukasz.Podręcznik jest nieco lepszy w opisywaniu znaczenia poszczególnych pól, zobacz tutaj kolekcje:
http://docs.mongodb.org/manual/reference/collection-statistics/
A tutaj statystyki bazy danych:
http://docs.mongodb.org/manual/reference/database-statistics/
Niektóre inne potencjalnie istotne informacje:
Polecenie kompaktowe nie zmniejsza plików danych; defragmentuje tylko usunięte miejsce, aby większe obiekty mogły go ponownie wykorzystać. Polecenie kompaktowe nigdy nie usunie ani nie zmniejszy plików bazy danych i ogólnie wymaga dodatkowej przestrzeni do wykonania swojej pracy, zwykle co najmniej jednego dodatkowego zakresu.
Jeśli naprawisz bazę danych, zasadniczo przepisuje ona pliki danych od zera, co usunie wypełnianie i zapisze je na dysku tak skutecznie, jak to tylko możliwe. Jednak aby to zrobić, musisz mieć ~ 2x rozmiar na dysku (właściwie mniej, ale jest to porządny przewodnik).
Należy pamiętać o jeszcze jednej rzeczy - naprawić i usunąć wyściółkę. Współczynnik dopełniania waha się od 1 (brak ruchów dokumentów spowodowanych powiększaniem się dokumentów) do 2 (wiele ruchów spowodowanych wzrostem dokumentów). Twój współczynnik wypełnienia wynoszący ~ 1,67 wskazywałby, że rośniesz (a więc powodujesz ruchy) całkiem sporo.
Podczas kompaktowania lub naprawy bazy danych usuwasz tę dopełnienie - kolejne powiększanie dokumentu spowoduje jeszcze więcej ruchów niż wcześniej. Ponieważ ruchy są relatywnie drogimi operacjami, może to mieć poważny wpływ na wydajność. Więcej informacji tutaj:
http://www.mongodb.org/display/DOCS/Padding+Factor
źródło
Dla mongodb> 3.x
Dla db.getCollection ('name'). Stats ()
Dla db.stats ()
Dzięki temu możemy usunąć nieużywane miejsce lub dziurę
Po uruchomieniu polecenia kompaktowania lub naprawy możemy uzyskać dokładny rozmiar pamięci i różnicę wielkości danych.
Technika kompresji w mongodb wiredTiger:
źródło