许多DateTime的比较更快

Jon*_*lis 5 c# algorithm big-o datetime

在效率方面,我遇到了一项我正在努力的任务.我有一个数据库,可以有成千上万的交易和人.我的目标是找到通常在彼此附近进行交易的人(人X在人Y的10分钟内进行了交易,在5个不同的场合).

我正在努力绕过一个有效的方法来解决这个问题.最简单的方法是:

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  
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

(TransactionID是一个bigint标识).一旦我有了我的列表hits,就很容易计算出现次数.但这显然很差.运行时间是 在此输入图像描述 在1M +交易中,这将是非常缓慢的.我已经研究了一些算法,但我发现任何适用于我的情况.任何人都可以提供指导,从哪里开始加快这个速度?

dec*_*cPL 5

几点提示:

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