【发布时间】:2014-01-28 06:02:05
【问题描述】:
一个非常大的数据集的精细聚合管道的收集输出基本上类似于以下内容:
{
"_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 字典来修改它们是昂贵的。我尝试了各种方法直接通过具有以下变体的游标更新记录,但均未成功:
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)
我也没有成功尝试使用 Mongo 的常用运算符,因为方差很简单,只需从数组的每个元素中减去平均值,然后对结果进行平方,然后对结果进行平均。
如果我可以直接成功地修改集合,那么我可以利用 Monary 或 IOPro 等非常快速的东西直接从 Mongo 加载数据并放入 numpy 数组,而无需额外开销。
感谢您的宝贵时间
【问题讨论】: