2010-10-11 12 views
11

Mam bazę danych CouchDB (v0.10.0), która ma rozmiar 8,2 GB i zawiera 3890000 dokumentów.Widok CouchDB jest bardzo wolny.

Teraz mam następujący jak mapa widoku

function(doc) {emit([doc.Status], doc); 

I zajmuje zawsze załadować (4 godziny i nadal nie wynik).

Oto kilka dodatkowych informacji, które mogłyby pomóc opisując sytuację:

  1. Widok nie jest rzutem temp. Widok jest zdefiniowany przed włożeniem dokumentów 3890000 .

  2. Na serwerze nie ma nic. Jest to box ubuntu z zainstalowanymi tylko domyślnymi ustawieniami.

  3. Widzę, że mój procesor się porusza i ciężko pracuje (czasami strzela do 100%). Pamięć się też porusza, ale nie narasta.

Więc moje pytanie brzmi:

  1. Co się rzeczywiście dzieje w tle?
  2. Czy jest to coś "jednorazowego", w którym muszę czekać raz, a to jakoś zadziała później?

Dziękujemy,

Chi

Odpowiedz

13

Widoki są aktualizowane tylko następnym razem, gdy są czytane. Po odczytaniu przetwarza wszystkie dokumenty, które zostały zaktualizowane (utworzone, zaktualizowane, usunięte) od czasu ostatniego odczytania widoku.

Więc nawet jeśli widok został zdefiniowany przed włożeniem 3890000 dokumentów, będzie przetwarzał 3890000 dokumentów dla widoku.

Od http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views

Należy pamiętać, że domyślnie poglądy nie są tworzone i aktualizowane, gdy dokument jest zapisany, ale raczej, gdy są one dostępne. W rezultacie pierwszy dostęp może zająć trochę czasu w zależności od rozmiaru danych, podczas gdy CouchDB tworzy widok. W razie potrzeby widoki można również aktualizować, gdy dokument jest zapisywany za pomocą zewnętrznego skryptu, który wywołuje widoki po dokonaniu aktualizacji. Przykład można znaleźć tutaj: RegeneratingViewsOnUpdate

także właśnie natknąłem się na to cynk, co może być przydatne, jeśli używasz na Ubuntu:

http://nosql.mypopescu.com/post/1299848121/couchdb-and-ubuntu-configuration-trick-for

+0

Idealnie! Myślę więc, że buduje indeks w tym czasie. I nawet jeśli uruchomię się ponownie, nie zrobię tego (od aktualizacji). Dzięki Evan! –

14

Nie emitują cały dokument. To niepotrzebne. Zamiast tego możesz uruchomić zapytanie z numerem include_docs=true, które umożliwi dostęp do dokumentu za pomocą atrybutu doc ​​każdego wiersza.

Po emisji całego dokumentu indeks jest większy lub większy niż cała baza danych.:)

+0

Mikeal ma rację, chociaż dodam jeszcze jeden wątek, o którym JasonSmith wspomniał, że jeśli wyślesz dokument do indeksu, indeks będzie znacznie większy, ale pobieranie będzie szybsze. Ale jak Mikeal zwraca uwagę, to sprawi, że twoje indeksy w zasadzie staną się kopiami twojego zestawu danych, więc jeśli pracujesz z DUŻYMI ​​danymi, nie emituj tego :) –

+0

Jak zatem wyglądałyby emitowane? emitować (doc.id)? –