Самый быстрый способ добавить поле к каждому документу в большом 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)