使用python为大型couchDB中的每个文档添加字段的最快方法

时间:2012-12-15 15:30:55

标签: python random couchdb couchdb-python

我有一个couchDB,有超过100万个条目分布在几个数据库中。我需要随机抽取样本,以便记录每个样本的成员。为此,请关注this问题我想在我的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)

这失败了,因为我没有足够的RAM来保存我所有CouchDB数据库的副本。

首次尝试以数据块加载数据库

关注this问题。

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 个答案:

答案 0 :(得分:0)

使用生成器以避免将大型列表加载到内存中

Marcus Brinkmann我发现代码为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)