我需要创造一个"可靠性"来自两个服务器的报告 - 服务器A
和服务器B
。
两者都追踪他们的正常运行时间 - 或者更确切地说,是任何他们不可用的情况。这些记录存储在SQL Server数据库表中
EventID INT (PK)
Server CHAR(1) -- 'A' or 'B'
EventStart DATETIME2(3)
EventEnd DATETIME2(3)
示例数据:
EventID Server EventStart EventEnd
--------------------------------------------------------------------
34 A 2014-12-12 14:00:00.000 2014-12-12 15:00:00.000
35 A 2014-12-20 10:00:00.000 2014-12-21 03:00:00.000
36 A 2014-12-27 16:30:00.000 2014-12-27 17:45:00.000
37 B 2014-12-15 04:00:00.000 2014-12-15 09:35:00.000
38 B 2014-12-20 20:00:00.000 2014-12-20 21:50:00.000
39 B 2014-12-27 15:00:00.000 2014-12-27 17:00:00.000
使用Entity Framework将这些数据行加载到.NET对象中,并在C#中进行计算。
现在给出这些项目,我需要确定(在给定月份)服务器A' A'和服务器' B'哪里 - 一块蛋糕(只需总结每台服务器停机时间的总分钟数并计算可用性)。
棘手的部分是:在本月内我还需要几分钟 BOTH 服务器停机 - 所以我可以计算一个"组合可用性"当两个服务器中至少有一个可以访问时。
当然,我可以枚举服务器的所有条目' A'并检查是否有任何服务器条目' B'重叠 - 但这似乎有点低效。
有没有更明智的方法来做到这一点?我在C#中基本上有两个Event
对象列表,这些对象具有与表有列相同的字段。
答案 0 :(得分:2)
这是一个算法:
EventStart
EventStart
,EventEnd
]与下一个EventStart
时间复杂度:O(NLog(N)) = O(O(N) + O(NLog(N)) + O(N))
。空间复杂度至少为O(N)
。其中 N 是两个列表中的项目数。
答案 1 :(得分:0)
对于每个事件,在服务器关闭时派生一个分钟列表(由DateTime对象表示)。因此,对于示例中的事件34,这将是60个DateTime对象。
将服务器的所有停机时间(DateTime对象)放入该服务器的组合列表中。
使用linq Union方法(http://msdn.microsoft.com/en-us/library/vstudio/bb341731(v=vs.110).aspx)查找两个服务器中列表的并集。呼叫联盟的结果,以查找合并的停机时间(以分钟为单位)。