2010-10-11 13 views
11

Tengo una base de datos CouchDB (v0.10.0) que tiene 8,2 GB de tamaño y contiene 3890000 documentos.La vista de CouchDB es extremadamente lenta

Ahora, tengo el siguiente como el mapa de la vista

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

y se necesita siempre para cargar (4 horas y todavía no hay resultado).

Aquí hay alguna información adicional que pueda ayudar a describir la situación:

  1. La vista no es una vista temp. La vista se define antes de que se inserten los documentos 3890000 .

  2. No hay nada en el servidor. Es un cuadro ubuntu con nada más que los valores predeterminados instalados.

  3. Veo que mi CPU se está moviendo y trabajando duro (a veces dispara al 100%). La memoria también se está moviendo, pero no aumenta.

Así que mi pregunta es:

  1. Lo que está sucediendo realmente en el fondo?
  2. ¿Es esto una "vez única" en la que tengo que esperar una vez y de alguna manera funcionará más tarde?

Muchas gracias,

Chi

Respuesta

13

Vistas sólo se actualizan la próxima vez que se leen. Al leer, procesa todos los documentos que se han actualizado (creado, actualizado, eliminado) desde la última vez que se leyó la vista.

Así que incluso si su vista se definió antes de insertar los documentos 3890000, procesará los 3890000 documentos para la vista.

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

Tenga en cuenta que por defecto puntos de vista no se crean y se actualizan cuando se guarda un documento, sino más bien, cuando se accede a ellos. Como resultado, el primer acceso puede tomar algo de tiempo dependiendo del tamaño de sus datos mientras CouchDB crea la vista. Si es preferible, las vistas también se pueden actualizar cuando se guarda un documento mediante un script externo que llama a las vistas cuando se han realizado actualizaciones. Un ejemplo se puede encontrar aquí: RegeneratingViewsOnUpdate

También encontré con este consejo, que podría ser útil si se está ejecutando en Ubuntu:

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

+0

¡Perfecto! Así que supongo que está construyendo el índice en ese momento. E incluso si reinicio, no hará esto (ya que la actualización está completa). Gracias Evan! –

14

no emiten todo el doc. No es necesario En su lugar, puede ejecutar su consulta con include_docs=true, que le permitirá acceder al documento a través del atributo doc de cada fila.

Cuando se emite todo el documento, el índice es tan grande o más grande que toda la base de datos.:)

+0

Mikeal tiene razón, aunque agregaré otro hilo JasonSmith mencionó que si usted emite el documento en un índice, el índice será mucho más grande, pero la recuperación será más rápida. Pero como Mikeal señala, esto hará que tus índices básicamente terminen siendo copias de tu conjunto de datos, así que si trabajas con datos GRANDES, no lo emitas :) –

+0

Entonces, ¿cómo se vería la emisión entonces? emitir (doc.id)? –

Cuestiones relacionadas