2010-10-11 6 views
11

J'ai une base de données CouchDB (v0.10.0) de 8,2 Go et contenant 3890000 documents.La vue CouchDB est extrêmement lente

Maintenant, je donne les résultats suivants comme Carte de la vue

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

Et il faut toujours à charge (4 heures et toujours pas de résultat).

Voici quelques informations supplémentaires qui pourraient aider à décrire la situation:

  1. La vue est pas une vue temporaire. La vue est définie avant que les documents 3890000 ne soient insérés.

  2. Il n'y a rien sur le serveur. C'est une boîte ubuntu avec rien mais les paramètres par défaut installés.

  3. Je vois que mon processeur se déplace et travaille dur (parfois à 100%). La mémoire bouge aussi mais n'augmente pas.

Ma question est:

  1. Qu'est-ce qui se passe réellement en arrière-plan?
  2. Est-ce une chose "une fois" où je dois attendre une fois et cela fonctionnera en quelque sorte plus tard?

Un grand merci,

Chi

Répondre

13

Vues sont mis à jour la prochaine fois qu'ils sont lus. En lisant, il traite tous les documents qui ont été mis à jour (créés, mis à jour, supprimés) depuis la dernière fois que la vue a été lue.

Ainsi, même si vous avez défini la vue avant d'insérer les documents 3890000, les documents 3890000 seront traités pour la vue.

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

Notez que par défaut les vues ne sont pas créés et mis à jour lorsqu'un document est enregistré, mais, quand ils sont accessibles. Par conséquent, le premier accès peut prendre un certain temps en fonction de la taille de vos données pendant que CouchDB crée la vue. Si cela est préférable, les vues peuvent également être mises à jour lorsqu'un document est enregistré à l'aide d'un script externe qui appelle les vues lorsque des mises à jour ont été effectuées. Un exemple peut être trouvé ici: RegeneratingViewsOnUpdate

juste a aussi rencontré cette astuce, ce qui pourrait être utile si vous utilisez sur Ubuntu:

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

+0

Parfait! Donc, je suppose qu'il construit l'indice à ce moment-là. Et même si je redémarre, il ne le fera pas (puisque la mise à jour est terminée). Merci Evan! –

14

Ne pas émettre l'ensemble doc. C'est inutile. Vous pouvez à la place exécuter votre requête avec include_docs=true, ce qui vous permettra d'accéder au document via l'attribut doc de chaque ligne. Lorsque vous émettez l'ensemble du document, l'index est plus grand ou plus grand que l'ensemble de votre base de données.:)

+0

Mikeal est juste, bien que je vais ajouter dans un autre thread mentionné que si Jason Smith vous émettez le doc dans un index, l'indice sera beaucoup plus grand, mais la récupération sera plus rapide. Mais comme Mikeal souligne cela fera vos indices essentiellement finissent par être des copies de votre ensemble de données, donc si vous travaillez avec des données BIG, émettent pas :) –

+0

Alors comment le Émettre ressembler alors? Emettre (doc.id)? –

Questions connexes