0

我有一个 couchdb 数据库实例,其中每个文档都有一个唯一的 id(字符串)。我想检查数据库中的每个文档并根据每个文档的内容执行一些外部操作(例如:连接到另一个 Web 服务器以获取特定的详细信息等)。但是,不是顺序遍历每个文档,是否可以首先获取这些文档键的 k 个桶的列表,这些文档键由起始键 + 结束键(id 是键)表示,然后查询每个文档中的所有文档单独存储桶并并行对每个存储桶的文档进行外部操作?

我目前使用 couchdb-python 来访问我的 db + 视图。例如,这是我目前使用的代码:

for res in db.view("mydbviews/id"):
  doc = db[res.id]
  do_external_operation(doc) # Time consuming operation

如果我可以为上述循环执行类似“parallel for”之类的操作,那就太好了。

4

1 回答 1

0

假设您只为视图中的每个文档发出一个结果,那么大概使用开始和结束键以及一些 python 并行化技术运行视图就足够了。正如@Ved 所说,这里更大的问题是并行处理,而不是生成文档子集。我推荐多处理模块,如下所示:

def work_on_subset(viewname, key_low, key_high):
    rows = db.view(viewname, startkey=key_low, endkey=key_high)
    for row in rows:
        pass # Do your work here

viewname = '_design/designname/_view/viewname'
key_list = [('a', 'z'), ('1', '10')] # Or whatever subset you want
pool = multiprocessing.Pool(processes=10) # Or however many you want
result = []
for (key_low, key_high) in key_list:
    result.append(pool.apply_async(work_on_subset, args=(viewname, key_low, key_high)))
pool.close()
pool.join()
于 2014-08-26T13:32:04.400 回答