在效率方面,我遇到了一项让我苦苦挣扎的任务。我有一个数据库,可以包含数十万笔交易和人员。我的目标是找到经常在彼此附近进行交易的人(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 身份)。一旦我有了 hits
列表,就很容易计算出现次数。但这显然很差。运行时间是
这在 1M+ 交易时会非常慢。我研究了一些算法,但找不到适用于我的情况的算法。任何人都可以提供关于从哪里开始加速的指导吗?
最佳答案
一些提示:
- 在数据库端执行(例如存储过程)- 加载和处理超过 100 万条记录会产生开销,即使算法得到改进也是如此。
- 将所有数据分成大小为
10
分钟的桶(假设 10 分钟是您的检测阈值)。然后对于每个桶,您只需要检查相邻的桶,这应该会减少比较操作量。 - 确保您在例如纪元时间以避免复杂的日期时间操作。
关于c# - 许多 DateTime 的比较速度更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22479892/