C# 快速比较多个日期时间';s

C# 快速比较多个日期时间';s,c#,algorithm,datetime,big-o,C#,Algorithm,Datetime,Big O,就效率而言,有人向我提出了一项我正在努力解决的任务。我有一个数据库,可以有成千上万的交易和人。我的目标是找到通常在彼此附近有交易的人(X个人在5个不同的情况下在Y个人10分钟内有交易) 我正努力寻找一种有效的方法来解决这个问题。最简单的方法是: foreach(var doc in db.Transactions.OrderBy(d => d.TransactionID)) { foreach(var doc2 in db.Transactions.Where(d => d.

就效率而言,有人向我提出了一项我正在努力解决的任务。我有一个数据库,可以有成千上万的交易和人。我的目标是找到通常在彼此附近有交易的人(X个人在5个不同的情况下在Y个人10分钟内有交易)

我正努力寻找一种有效的方法来解决这个问题。最简单的方法是:

foreach(var doc in db.Transactions.OrderBy(d => d.TransactionID))
{
    foreach(var doc2 in db.Transactions.Where(d => d.TransactionID > doc.TransactionID))
    {
        if(doc2.DateCreated.IsBetween(doc.DateCreated,minutes))
        {
           // hit found  
        }
    }
} 
(TransactionID是一个bigint标识)。一旦我有了我的
点击列表
,就很容易统计发生的次数。但这显然很糟糕。运行时间是 在100万以上的交易中,这将非常缓慢。我已经研究了一些算法,但我找不到任何适用于我的情况。有人能提供关于从何处开始加速的指导吗?

一些提示:

  • 在数据库端执行(例如存储过程)-加载和处理1M+记录将产生开销,即使算法得到改进
  • 将所有数据分成大小为
    10
    分钟的存储桶(假设10分钟是您的检测阈值)。然后,对于每个bucket,您只需要检查相邻的bucket,这将减少比较操作的量
  • 确保在例如历元时间进行操作,以避免复杂的日期时间操作

  • 除了decPL的提示之外,您可能还需要使用事务数据建立一个数据仓库,然后可以在夜间对其进行分析。这意味着您将有关数据的数据存储在一个单独的数据库中,然后使用已知的算法对该数据库进行模式扫描。这就是像亚马逊这样的服务提出“买了这个的人,也买了……”建议的方式

    仓库中的数据可以优化以实现快速处理,因此它不需要遵循与实际(“源”)数据库相同的格式。分析过程(报告)的输出也可以是一种易于事后处理的格式,可能像您在问题中所做的那样使用LINQ


    更多信息见和./p>为什么要在过滤之前排序?在时间段中散列所有的日期时间,那么如果性能是一个问题,你应该得到一个Range.你应该考虑为这个段降LINQ并做出你自己的查询.好点,结果是一样的,无需使用自定义SP来处理此类大数据查询。感谢decPL,我肯定会在数据库端执行此操作-上面的示例主要是敲出伪代码。你能把

    (2)
    再详细一点吗?你是说按创建的时间排序,然后循环每10分钟一段吗?我特别不想谈太多细节,因为实际的实现方式会根据你处理这个问题的方式有很大的不同(例如,如果你遵循Roy的方法)(顺便说一句,我强烈建议您这样做,前提是您可以考虑运营成本)并且,比如说,使用OLAP多维数据集,那么您的大部分工作都将为您完成)。如果要得到具体的答案,我会说-按如下方式做:设置一个临时表,保存一部分数据(两个连续的10分钟大小的“块”)-且仅相关列。[继续][继续]仅对第一个“块”中的记录进行操作,检查临时表中的任何数据是否符合您的条件。完成后,丢弃第一个“块”并加载另一个-重复操作,直到完成。