В основном выходной сбора сложной совокупности трубопровода для очень большого набора данных аналогичен следующему:PyMongo обновления записей массива с вычисляемыми полями с помощью курсора
{
"_id" : {
"clienta" : NumberLong(460011766),
"clientb" : NumberLong(2886729962)
},
"states" : [
[
"fixed", "fixed.rotated","fixed.rotated.off"
]
],
"VBPP" : [
244,
182,
184,
11,
299,
],
"PPF" : 72.4,
}
Интуитивного, хотя и медленно, способ обновления этих полей чтобы расчеты самих себя (длина и дисперсии массива) с PyMongo перед преобразованием в массивах выглядит следующим образом:
records_list = []
cursor = db.clientAgg.find({}, {'_id' : 0,
'states' : 1,
'VBPP' : 1,
'PPF': 1})
for record in cursor:
records_list.append(record)
for dicts in records_list:
dicts['states'] = len(dicts['states'])
dicts['VBPP'] = np.var(dicts['VBPP'])
Я написал различные формы этого основного потока для оптимизации скорости, но чего в 500k словари в память y, чтобы изменить их, прежде чем преобразовывать их в массивы, чтобы пройти оценку машинного обучения, является дорогостоящим. Я пробовал различные способы для обновления записей непосредственно через курсор с вариантами следующего без успеха:
cursor = db.clientAgg.find().skip(0).limit(50000)
def iter():
for item in cursor:
yield item
l = []
for x in iter():
x['VBPP'] = np.var(x['VBPP'])
# Or
# db.clientAgg.update({'_id':x['_id']},{'$set':{'x.VBPS': somefunction as above }},upsert=False, multi=True)
я безуспешно пытался с помощью обычных операторов Монго со времени дисперсии так просто, как вычитания среднего из каждого элемента массива, возведение в квадрат результата, затем усреднение результатов.
Если бы я мог успешно изменить коллекцию напрямую, я мог бы использовать что-то очень быстрое, как Monary или IOPro, для загрузки данных непосредственно из Mongo и в массив numpy без дополнительных накладных расходов.
Спасибо за ваше время
Интересно, спасибо за информацию. Я обыскиваю JIRA, но пропустил эти прекрасные находки. Таким образом, похоже, что мне придется принести эти объекты в память, чтобы сделать calc и написать константу в конце концов. – KLDavenport
Есть ли у вас рекомендации по масштабируемым решениям с Python. Я не могу связать некоторые операторы разматывания. – KLDavenport
К сожалению, автор Монари уже давно был МВД. Кажется, что нет способа перемотки курсора из метода aggregate() find() - это просто cursor.rewind(). Попытка сделать это с помощью агрегата «InvalidOperation: не может вызвать перемотку по командному курсору» – KLDavenport