我有一个couchDB,有100多万条条目分布在几个数据库中。我需要从抽样调查中随机抽取样本,这样我就有了每个样本成员的记录。为此,在这问题之后,我想在我的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中迭代一个大列表,我会编写一个生成器表达式。我如何在中做到这一点?或者,还有更好的方法吗?
发布于 2012-12-15 21:03:04
使用生成器避免将大型列表加载到内存中。
在马库斯·布林克曼中,我找到了对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)
https://stackoverflow.com/questions/13893501
复制相似问题