C# 计算每秒的事件速率
我有一个包含数百万个事件的游戏文件,文件大小可以>10gb 每条线都是一个游戏动作,如:C# 计算每秒的事件速率,c#,algorithm,rate,C#,Algorithm,Rate,我有一个包含数百万个事件的游戏文件,文件大小可以>10gb 每条线都是一个游戏动作,如: player 1, action=kill, timestamp=xxxx(ms granularity) player 1, action=jump, timestamp=xxxx player 2, action=fire, timestamp=xxxx 对于此数据集,每个操作都是唯一和有限的 我想对这个文件执行分析,比如每秒事件的总数,同时跟踪该秒钟内的单个操作数 我的半伪代码计划: lastRea
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)
lastReadGameEventTime=DateTime.MinValue;
while(line=getNextLine()!=null)
{
解析_值(lastReadGameEventTime、out var timestamp、out var action);
如果(时间戳==最小值)
{
lastReadGameEventTime=时间戳;
}
else if(timestamp.subtract(lastReadGameEventTime).TotalSeconds>1)
{
第二次通知各点(数据点);
数据点=新的T();
}
如果(!datapoints.TryGetValue(操作,输出变量操作))
act=新字典();
act[动作]=0;
其他的
动作[动作]+;
}
lastReadGameEventTime=解析时间(行)
我担心这太天真了。我在想也许数一整分钟,得到平均每秒。但我当然会错过比赛项目高峰。
如果我想计算5天的平均值,它会进一步降低结果集。
有什么好主意吗?你在问几个不同的问题。所有这些都是相关的。你的要求不是很详细,但我想我可以为你指出正确的方向。我假设你想要的只是过去某段时间内每秒的事件数。所以我们所需要的就是在这段时间内每秒钟保存一个整数(事件计数) 一天有86400秒。假设你想要10天的信息。您可以构建大小为864000的循环缓冲区,以保存10天的计数:
const int SecondsPerDay = 86400;
const int TenDays = 10 * SecondsPerDay;
int[] TenDaysEvents = new int[TenDays];
所以你总是有最后10天的计数
假设您有一个读取套接字数据并将信息传递给函数的事件处理程序,则可以轻松地更新数据:
DateTime lastEventTime = DateTime.MinValue;
int lastTimeIndex = 0;
void ProcessReceivedEvent(string event)
{
// here, parse the event string to get the DateTime
DateTime eventTime = GetEventDate(event);
if (lastEventTime == DateTime.MinValue)
{
lastTimeIndex = 0;
}
else if (eventTime != lastEventTime)
{
// get number of seconds since last event
var elapsedTime = eventTime - lastEventTime;
var elapsedSeconds = (int)elapsedTime.TotalSeconds;
// For each of those seconds, set the number of events to 0
for (int i = 1; i <= elapsedSeconds; ++i)
{
lastTimeIndex = (lastTimeIndex + 1) % TenDays; // wrap around if we get past the end
TenDaysEvents[lastTimeIndex] = 0;
}
}
// Now increment the count for the current time index
++TenDaysEvents[lastTimeIndex];
}
DateTime lastEventTime=DateTime.MinValue;
int lastTimeIndex=0;
void ProcessReceivedEvent(字符串事件)
{
//这里,解析事件字符串以获取日期时间
DateTime eventTime=GetEventDate(事件);
if(lastEventTime==DateTime.MinValue)
{
lastTimeIndex=0;
}
else if(eventTime!=lastEventTime)
{
//获取自上次事件以来的秒数
var elapsedTime=eventTime-lastEventTime;
var elapsedSeconds=(int)elapsedTime.TotalSeconds;
//对于每一秒,将事件数设置为0
对于(int i=1;i你在这里问了几个不同的问题。所有问题都是相关的。你的要求不是很详细,但我想我可以为你指出正确的方向。我假设你想要的是过去某段时间内每秒的事件数。所以我们需要的是某种方法来保持整数(事件计数)在这段时间里每一秒
一天有86400秒。假设您需要10天的信息。您可以构建一个大小为864000的循环缓冲区来保存10天的计数:
const int SecondsPerDay = 86400;
const int TenDays = 10 * SecondsPerDay;
int[] TenDaysEvents = new int[TenDays];
所以你总是有最后10天的计数
假设您有一个读取套接字数据并将信息传递给函数的事件处理程序,则可以轻松地更新数据:
DateTime lastEventTime = DateTime.MinValue;
int lastTimeIndex = 0;
void ProcessReceivedEvent(string event)
{
// here, parse the event string to get the DateTime
DateTime eventTime = GetEventDate(event);
if (lastEventTime == DateTime.MinValue)
{
lastTimeIndex = 0;
}
else if (eventTime != lastEventTime)
{
// get number of seconds since last event
var elapsedTime = eventTime - lastEventTime;
var elapsedSeconds = (int)elapsedTime.TotalSeconds;
// For each of those seconds, set the number of events to 0
for (int i = 1; i <= elapsedSeconds; ++i)
{
lastTimeIndex = (lastTimeIndex + 1) % TenDays; // wrap around if we get past the end
TenDaysEvents[lastTimeIndex] = 0;
}
}
// Now increment the count for the current time index
++TenDaysEvents[lastTimeIndex];
}
DateTime lastEventTime=DateTime.MinValue;
int lastTimeIndex=0;
void ProcessReceivedEvent(字符串事件)
{
//这里,解析事件字符串以获取日期时间
DateTime eventTime=GetEventDate(事件);
if(lastEventTime==DateTime.MinValue)
{
lastTimeIndex=0;
}
else if(eventTime!=lastEventTime)
{
//获取自上次事件以来的秒数
var elapsedTime=eventTime-lastEventTime;
var elapsedSeconds=(int)elapsedTime.TotalSeconds;
//对于每一秒,将事件数设置为0
对于(int i=1;我将其加载到数据库中,并使用SQL,不要为此重新创建特定于场景的数据库。在例如oracle中:选择TRUNC('SS',eventtime),按TRUNC('SS',eventtime)从事件组中计数(*)
-每秒的事件数。每天/周/月等只需更改SSI您想要分组时间。因此,您想要秒、分钟、小时、天的平均值和最大值。一个数据库很好,但我也可以实时执行此分析。就像在脱离socket时一样,将其加载到数据库中,并使用SQL,不要重新创建特定于场景的数据在oracle中:选择TRUNC('SS',eventtime),按TRUNC('SS',eventtime)从事件组中计数(*)
-每秒的事件数。每天/周/月等只需更改SSI您想要分组时间。因此,您想要秒、分钟、小时、天的平均值和最大值。一个数据库很好,但我也可以实时执行此分析。如在off-A Sockettethanks中获得详细答案Jim。这听起来像是我需要的指导埃德,谢谢!谢谢你详细的回答吉姆。这听起来像是我需要的指导,谢谢!