0

私は、いくつかのデータベースにまたがる 100 万を超えるエントリを持つ couchDB を持っています。各サンプルのメンバーの記録が得られるように、サンプルをランダムに抽出する必要があります。そのために、この質問に従って、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 データベースのコピーを保持するのに十分な RAM がないため、これは失敗します。

最初の試行 - データベースをチャンクでロード

この質問に続いて。

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 でそれを行うにはどうすればよいですか? または、より良い方法はありますか?

4

1 に答える 1

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)
于 2012-12-16T05:03:04.643 に答える