【发布时间】:2019-01-07 09:11:08
【问题描述】:
我有一个包含数百万个事件的游戏文件,文件大小可以> 10gb
每一行都是一个游戏动作,比如:
player 1, action=kill, timestamp=xxxx(ms granularity)
player 1, action=jump, timestamp=xxxx
player 2, action=fire, timestamp=xxxx
对于此数据集,每个操作都是唯一且有限的。
我想对此文件执行分析,例如每秒事件总数,同时跟踪该秒内的单个操作数。
我的半伪代码计划:
lastReadGameEventTime = DateTime.MinValue;
while(line=getNextLine() != null)
{
parse_values(lastReadGameEventTime, out var timestamp, out var action);
if(timestamp == MinValue)
{
lastReadGameEventTime = timestamp;
}
else if(timestamp.subtract(lastReadGameEventTime).TotalSeconds > 1)
{
notify_points_for_this_second(datapoints);
datapoints = new T();
}
if(!datapoints.TryGetValue(action, out var act))
act = new Dictionary<string,int>();
act[action] = 0;
else
act[action]++;
}
lastReadGameEventTime = parse_time(line)
我担心这太天真了。我在想也许可以计算整分钟并获得每秒的平均值。但我当然会错过游戏事件高峰。 如果我想计算 5 天的平均值,它会进一步降低结果集。 有什么聪明的主意吗?
【问题讨论】:
-
将其加载到数据库中,并使用 SQL,不要为此重新创建特定于场景的数据库。在例如 oracle 中:
SELECT TRUNC('SS', eventtime), COUNT(*) FROM events GROUP BY TRUNC('SS', eventtime)- 每秒的事件数。每天/每周/每月等只需更改 SS -
您想对时间进行分组。因此,您需要秒、分钟、小时、天的平均值和最大值。
-
一个数据库会很好,但我也可以实时执行此分析.. 就像在套接字中一样