C# 有没有处理大量数据的好方法?

C# 有没有处理大量数据的好方法?,c#,.net,sql,database,algorithm,C#,.net,Sql,Database,Algorithm,我在数据库中有将近100.000条记录,我需要用最长的通用子序列算法相互比较,我每天需要用1000条新记录进行比较。 我的应用程序是用c#.Net编写的,问题是这种比较在应用程序级别上运行得很慢,因为比较1000条记录需要10个多小时。 所以,如果我用SQL在存储过程中编写这个算法,有人知道它会快多少吗?或者有其他方法吗?确实,存储过程比LinQ或View工作得更快。这就是快速收集数据的方法。如果您“只有”10万条记录。只要在你的应用程序启动时收集它们就可以了。在内存中执行算法,完成后将任何结果

我在数据库中有将近100.000条记录,我需要用最长的通用子序列算法相互比较,我每天需要用1000条新记录进行比较。
我的应用程序是用c#.Net编写的,问题是这种比较在应用程序级别上运行得很慢,因为比较1000条记录需要10个多小时。
所以,如果我用SQL在存储过程中编写这个算法,有人知道它会快多少吗?或者有其他方法吗?

确实,存储过程比LinQ或View工作得更快。这就是快速收集数据的方法。

如果您“只有”10万条记录。只要在你的应用程序启动时收集它们就可以了。在内存中执行算法,完成后将任何结果/更改存储到数据库中


它会快得多

我不确定TSQL是否会像C#一样为您提供同样的灵活性,特别是当您处理像LCS这样的复杂算法时。将所有需要的记录存储在内存中,并从内存中处理它们


现在最重要的是,你们可以跳出框框思考一分钟,然后换一种方法,尝试在插入新项目后插入某种标志(排名)。这里没有人能给你建议,因为你没有提供一点数据,你在做什么,你在比较什么。也许你们可以在插入新物品的过程中,通过一些排名来简化这个过程。我的意思不是在添加新项后进行完全比较,而是触发事件,比如每隔一小时左右更新一次表,而无需用户输入。

如果您使用的是SQL server 2005或2008,您可能需要尝试用C#编写一个存储过程。从长远来看,这可能会更好地扩展,因为您会获得越来越多的记录,并且无法将它们全部保存在内存中

看看这本书


这将在数据库服务器上使用更多的CPU,但您不必来回传输数据。

如何确定两个记录彼此之间的后续关系(即它们是子序列的一部分)?也许你不需要比较每条记录的全部1MB,只需分析其中的一部分就可以加快速度


在我看来,您的算法有缺陷,或者如果比较每条记录需要2秒钟,则DB可能不是存储数据的最佳方式?

比较1000条记录需要10个多小时?你的算法肯定有问题,存储过程帮不了你多少忙。目前有10万条,但一年内将有数百万条记录。在比较过程中,我用LCS算法比较了六个字符串(写行,比如代码和全名),并将它们从西里尔文转换成拉丁文。为了将我所指的1000条记录与其他100.000条记录进行比较;LCS是NP难的,两个序列的LCS的简单实现在时间和内存上是二次的(在序列的长度上)。如果需要查找10万条记录的LCS,可能需要时间(取决于算法和序列大小)。10小时有点高,但对于1000条记录,每次添加记录时,他实际上可能在100.000+1.000条记录上运行LCS。@Peace,我认为您可以从100.000条记录中最短的字符串中保留一个包含2^n个子字符串的列表,并保持更新(以显示所有100.000条记录中存在的子字符串)。然后,在添加新记录时,您不必与所有记录进行比较,您可以与此列表进行比较,并标记仍保留LCS候选记录的记录。你到底在为数百万条记录计算LCS做什么,而这么多记录最终不是一个空字符串吗?(我问的原因是——如果不是,那么有一些关系可能会以不同的方式建模)嗯,我有一些名称和不同代码的数据库,这些数据库会延迟更新,我需要检查它们是否相同,或者它们有多相似。即使这些记录太大,无法一次装入内存,比如说,每个都有1兆字节,加载一个子集(比如500)并在该批上运行LCS算法,注意最佳答案,然后继续下一批500条记录可能仍然比对每个输入字符串迭代整个100000条要好。我使用最长的通用子序列算法将新插入的字符串与数据库中的所有其他字符串进行比较。只有以干净、正确的方式编写存储过程,我确信有些开发人员能够编写执行效果非常差的存储过程。所以说SP总是更快不是真的,它可以更快(如果由一个好的开发人员完成)。例如:使用linq,您可以使用where条件,但它将再次获取所有数据,并根据您的where条件收集特定数据。您是正确的,在编写存储过程时需要保持清晰。如果正确写入条件,SP将更快。