在效率方面,我遇到了一项我正在努力解决的任务。我有一个可以拥有数十万笔交易的数据库。人。我的目标是找到通常在彼此附近进行交易的人(人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
}
}
}
(TransactionID是一个bigint标识)。获得hits
列表后,很容易计算出现次数。但这显然很差。运行时间是
在1M +交易中会非常慢。我已经研究了一些算法,但我发现任何适用于我的情况。任何人都可以提供指导,从哪里开始加快速度?
答案 0 :(得分:5)
几点提示:
10
分钟的存储分区(假设10分钟是您的检测阈值)。然后,对于每个桶,您只需要检查相邻的桶,这应该减少比较操作的量。答案 1 :(得分:3)
除了decPL的提示之外,您可能还想设置一个包含交易数据的数据仓库,然后可以在晚上进行分析。这意味着您将有关数据的数据存储在单独的数据库中,然后使用已知算法扫描该数据库的模式。这就是像亚马逊这样的服务提出那些“买了这个,也买了......的人”的建议。
仓库中的数据可以针对快速处理进行优化,因此不需要遵循与实际(“源”)数据库相同的格式。分析过程(报告)的输出也可以采用易于处理的格式,可能使用LINQ,就像您在问题中一样。
有关详细信息,请参阅http://en.wikipedia.org/wiki/Data_warehouse和http://www.1keydata.com/datawarehousing/datawarehouse.html。