C# 计算每秒的事件速率

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

我有一个包含数百万个事件的游戏文件,文件大小可以>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)
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。这听起来像是我需要的指导埃德,谢谢!谢谢你详细的回答吉姆。这听起来像是我需要的指导,谢谢!