def getPacketLength(self,groupid,lasttime,tapid):
pkt_collection = db['tap_pkts']
reqtime= [1417177485,1417177500,........,1414585185]
total_sum=0
resultset=[{"$match":{"groupid":int(groupid),
"$and":[{"first_time":{"$lte":reqtime}},{"time": {"$gte":reqtime}}],
"tapid":int(tapid)}},
{'$group':{'_id':'','packetlength':{'$sum':'$pkt_length'}}}]
sum_resultset=pkt_collection.aggregate(pipeline=resultset)
return
目标:
我需要为每5分钟的时间间隔检索一个月的数据。
我有时间阿瑞说,有2000个时间间隔。
timeArray=[1417177485,1417177500,........,1414585185]
从这个时间开始,每次我必须在数据库集合中进行迭代和比较,这次timeArray必须大于等于或小于等于#first_time'和'时间' DB中的字段。如果这个条件是满足的,那么' pkt_length'集合的字段和存储在数组中。在timeArray中一直重复这个。
output:
sumOfPktLengths=[4,9,..........6]
面临问题:(绩效问题)
现在我在函数内部编写mongo查询,并在timeArray中为每个值(时间)编写我从服务器调用此函数,该服务器将执行单个值(时间)的查询并将输出返回给服务器timeArray中的每个值(时间)。 因此,如果我的时间timeArray大小是2000服务器将命中DB f0r 2000次。 所以每次进行数据库和服务器交互都会降低性能。因此,每次代替服务器与Db交互,我需要为查询级别本身的每个值(时间)迭代timeArray,并将值数组发送回服务器。
output:
sumOfPktLengths=[4,9,..........6]
return sumOfPktsLength
文件:这是与通讯相关的项目
在Mondodb我的收藏中包含以下数据,我只包含一个文件
db.collections.find()
{
"_id" : {
"hash" : "d5229340b53f0493bb391c06f479da6d0ddb7327b7413414844c5309"
},
"count" : 28719,
"latency" : [
0
],
"first_time" : 1416810981.083066,
"cal_debug" : true,
"tuple" : {
"sip" : "192.162.2.1",
"dip" : "192.162.2.2",
"groupid" : 3,
"proto" : 1
},
"tapid" : 5,
"drop" : false,
"pkt_length" : 102,
"groupname" : "TapGroup-1",
"swap" : false,
"time" : 1417444470.313817,
"path" : [
5
],
"filter_bits" : 56,
"groupid" : 3,
"hash" : "d5229340b53f0493bb391c06f479da6d0ddb7327b7413414844c5309",
"tapname" : "t-1"
}
以上是集合中的一个文档。本文档包含" first_time"和"时间"领域。 "时间"将永远是第一次"。
" FIRST_TIME"是数据包传输的开始时间和"时间"是数据包传输的结束时间。
要绘制1个月数据的图表,我们将采用currentdate-1month = reqtime
从每5分钟一次的请求时间开始,我们将获得一个时间列表,我们可以在下面的请求中看到它作为数组形式。
reqtime = [17464544,............,171755378]将包含5分钟间隔1个月的时间戳
来自“reqtime'”的数组。对于数组中的每个值,我们将比较时间是否介于" first_time"和"时间"如果是,请加上" pkt_length"对于所有匹配的文档。然后在reqtime中对下一个值重复相同的过程,依此类推......直到它达到reqtime中的最后一个值。
这是我尝试实施的过程。而不是将所有时间一直存储在reqtime中作为数组然后进行比较..如果你觉得任何其他建议哪个查询本身每隔5分钟间隔1个月..你可以建议我。