我有一个〜500万个文件的表格集合。他们看起来像下面这样:为什么mongo总计花费这么长时间?
fr to weight
我有fr
和to
6000
可能值。我创建了以下代码,将所有可能的fr
字段的所有权重总和为to
,例如,
1 1 sum(all documents with fr=1 to=1)
1 2 sum(all documents with fr=1 to=2)
...
我以前pyMongo
写剧本,而cells
是所有可能的fr
/to
字段的数组,并calls
是集我有我的约5万份文档。
for _from in cells: #pair up each cell with each other cell
for _to in cells:
s = calls.aggregate([
{
'$match':
{
"fr": _from,
"to": _to
}
},
{
'$group': {'_id': 'null', 'sum': {'$sum':'$weight'}}
}])
if s['result']:
fr_to_sum = s['result'][0]['sum']
_id = entropy.insert({
'to': _to,
'fr': _from,
'sum': fr_to_sum
})
我正在使用一台机器。
另一个数据库会更好吗?例如。一些SQL?
UPDATE
字段fr
和to
包含在1-100000
范围内的整数,而weight
是小float
。我尽量让fr
和to
之间的所有可能的组合和值相加这些组合,因为有可能是其中有fr
和to
同一数据库中有重复的文件(如fr=1 to=2 weight=0.004
和fr=1 to=2 weight=0.01
,所以在这种情况下,我想有在我entropy
表fr=1 to=2 weight=0.014
。
而只是作为一个样本
>> db.week_calls.count({'fr':10, 'to':102})
>> 4
调用db.week_calls.getIndexes()
后,我得到了
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "db.week_calls",
"name" : "_id_"
}
这似乎很奇怪,因为我创建和db.calls.ensure_index([("fr",1), ("to",1)])
你有'fr'和'to'的索引吗?在您选择的“范围”中匹配多少个文档。 –
是的,我用'db.calls.ensure_index([(“fr”,1),(“to”,1)])'。 “范围”是什么意思? – Pio
通过添加“fr”和“to”条件,可以“匹配”多少个文档。通过描述更多你想要做的事情,你的问题可能会更好地解释。那么你是否想要所有'fr'和'to'的唯一值? –