检索并比较具有多个列的非常大的数据集

时间:2014-10-16 18:17:34

标签: c# sql .net

要求:我有多个数据库(Oracle / SQL Server)等。从数据库中我需要将大量/大量数据存入c#程序并将数据与其他数据进行比较。来自数据集的每个数据文件都有一个密钥(不是100%唯一,也可能有重复),使用该密钥我可以比较其他数据集文件/数据库。

每个数据库将返回大约150万行。我有5个不同的数据库,我将从中获取数据。即750万行将加载到我的程序中。

  1. 将数据加载到程序中的最佳方法是什么(目前每个SQL在数据库端需要5分钟)。加载到CSV然后读入C#?还有其他想法吗?

  2. 我打算用c#将数据加载到HashSet中,这是一个不错的选择吗?

  3. DB 1:
    Account   Amount
    1234  1
    9999  66
    
    DB 2:
    Account   Amount
    1234  2
    9999  66
    
    DB 3:
    Account   Amount
    1234  1
    9999  66
    
    DB 4:
    Account   Amount
    1234  10
    9999  66
    
    After comparing the output looks like
    Account   DB1 Amt DB1 Amt DB3 Amt DB4 Amt Match?
    1234  1   2   1   10  No
    9999  66  66  66  66  Yes
    

1 个答案:

答案 0 :(得分:0)

尊重,这不是一个大问题。这是一个中等规模的问题,你必须处理7.5个megarows。在您的示例中,这些行似乎相对较短。如果您可以访问具有超过2 GB RAM的计算机,则可以非常轻松地在RAM中完成整个工作。典型的2011年代笔记本电脑可以做到这一点。几乎任何Win x64笔记本电脑都可以在RAM中完成。

您询问是否应直接从数据库系统或CSV中提取数据。如果您计划在生产中使用此系统,则应坚持使用数据库系统。这避免了错误地处理陈旧数据的可能性。

从您的问题看,您的各种系统中的Account值看起来完全匹配,没有很多关于模糊匹配的猴子业务。也就是说,似乎帐户被称为" 1234"在几个数据库中,而不是" 1234"在其中一个," 1234-001"在另一个," A1234-2014"在第三个。这是个好消息。这意味着你可以使用HashSets之类的东西在内存中处理它们。

您可能应该设置系统,以便它可以处理所有数据或Account值的任意子集。例如,您可以允许将子集指定为' 1000' - ' 1999'。这对于测试来说非常方便,因为您只需几千个帐户即可进行短期运行。这应该意味着您可以使用短时间运行的子集查询。如果您对一切运作良好感到满意,您可以开始生产并回家过夜。

请注意,如果这是一次性工作,您可能只需在您的个人计算机上安装一些DBMS(MySQL或PostgreSQL将是很好的开源选择),将各种数据库系统的各种提取加载到其中的表中,并在他们身上做JOIN。

最后,如果您继承质量未知的数据,Google可让您下载一个非常有用的数据检查和清理工具OpenRefine