Равное распределение ключей документа couchdb для параллельной обработки

У меня есть экземпляр db couchdb, где каждый документ имеет уникальный идентификатор (строка). Я хотел бы просмотреть каждый документ в db и выполнить некоторую внешнюю операцию, основанную на содержимом каждого документа (например: подключение к другому веб-серверу для получения конкретных сведений и т.д.). Однако вместо последовательного перехода по каждому документу можно сначала получить список 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" для вышеуказанного цикла.

1 ответ

Предполагая, что вы используете только один результат для каждого документа в представлении, то, предположительно, запуск представления с помощью начального и конечного ключей вместе с некоторыми методами параллелизации питона достаточно здесь. Как поясняет @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()

licensed under cc by-sa 3.0 with attribution.