2010-10-11 102 views
11

我有一个CouchDB(v0.10.0)数据库,其大小为8.2 GB,包含3890000个文档。CouchDB视图非常慢

现在,我有以下的地图视图

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

,并需要永远加载(4小时,仍然没有结果)。

这里的一些额外的信息,可能有助于说明情况:

  1. 的看法是不是一个临时视图。在插入3890000 文档之前定义了 视图。

  2. 服务器上没有任何东西。这是一个只有默认安装的Ubuntu机器。

  3. 我看到我的CPU正在移动并努力工作(有时会拍摄到100%)。记忆也在移动,但并未增加。

所以我的问题是:

  1. 什么是在后台实际发生的?
  2. 这是一次“一次”的事情,我必须等待一次,它会以某种方式后来工作?

非常感谢,

回答

13

视图是它们的读取下一次才会更新。读取后,它会处理自上次读取视图以来更新(创建,更新,删除)的所有文档。

因此,即使您在插入3890000个文档之前定义了视图,它也会处理该视图的3890000个文档。

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

注意缺省情况下不会创建的视图,当保存文档更新,而是,当他们访问。因此,当CouchDB创建视图时,首次访问可能需要一些时间,具体取决于数据的大小。如果可取的话,当使用调用更新时调用视图的外部脚本保存文档时,也可以更新视图。一个例子可以在这里找到:RegeneratingViewsOnUpdate

也只是碰到这种提示,如果你的Ubuntu上运行,这可能是有用的传来:

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

+0

完美!所以我想这是在建立索引。即使我重新启动它不会这样做(因为更新完成)。谢谢埃文! – 2010-10-12 02:39:21

14

不要发出整个文档。这是没有必要的。您可以改为使用include_docs=true运行您的查询,这将允许您通过每行的doc属性访问文档。

当您发出整个文档时,您会将索引设置为大于或大于整个数据库。:)

+0

Mikeal是对的,虽然我会在另一个线程中加入JasonSmith提到的,如果您将文档发布到索引中,索引将会更大,但检索速度会更快。但是,正如Mikeal指出的那样,这将使您的索引基本上最终成为您的数据集的副本,所以如果您正在处理大数据,请不要发射它:) – 2011-09-18 04:39:37

+0

那么如何看待发射?发射(doc.id)? – 2015-01-08 10:05:11