Самый быстрый способ добавить поле к каждому документу в большом couchDB, используя python

У меня есть couchDB с более чем 1 миллионом записей, распределенных по нескольким базам данных. Мне нужно сделать случайные выборки, чтобы у меня была запись о членах каждой выборки. С этой целью и после этого вопроса я хочу добавить поле со случайным числом для каждого документа в моем couchDB.

Код для добавления случайного числа

def add_random_fields():
    from numpy.random import rand
    server = couchdb.Server()
    databases = [database for database in server if not database.startswith('_')]
    for database in databases:
        print database
        for document in server[database]:
            if 'results' in server[database][document].keys():
                for tweet in server[database][document]['results']:
                    if 'rand_num' not in tweet.keys():
                        tweet['rand_num'] = rand()
                        server[database].save(tweet)

Это терпит неудачу, потому что у меня недостаточно оперативной памяти для хранения копии всех моих баз данных CouchDB.

Первая попытка - загрузить базы данных кусками

После этого вопроса.

def grouper(n, iterable, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

# ..Just showing relevant part of add_random_fields()

   #..
        chunk_size=100
        for tweet in grouper(server[database][document]['results'],chunk_size):

Если бы я перебирал большой список в Python, я бы написал выражение генератора. Как я могу сделать это в couchdb-python? Или есть лучший способ?

1 ответ

Используйте генератор, чтобы избежать загрузки больших списков в память

От Маркуса Бринкмана я нашел код для создания генератора всех документов в базе данных couchDB. Пусть этот генератор будет называться couchdb_pager,

Исходная функция становится следующей.

def add_random_fields():
    from numpy.random import rand
    server = couchdb.Server()
    databases = [database for database in server if not database.startswith('_')]
    for database in databases:
        for document in couchdb_pager(server[database]):
            if 'results' in server[database][document]:
                for tweet in server[database][document]['results']:
                    if tweet and 'rand_num' not in tweet:
                        print document
                        tweet['rand_num'] = rand()
                        server[database].save(tweet)
Другие вопросы по тегам