检索和比较具有多列的大型数据集
本文关键字:大型 数据集 比较 检索 | 更新日期: 2023-09-27 18:26:44
要求:我有多个数据库(Oracle/SQL Server)等。从数据库中,我需要将大量数据放入c#程序中,并将数据与其他数据库进行比较。数据集中的每个数据文件都有一个密钥(不是100%唯一的,也可能有重复项),使用该密钥我可以比较其他数据集文件/数据库。
每个数据库将返回大约150万行。我有5个不同的数据库,我将从中获取数据。即750万行将加载到我的程序中。
-
将数据加载到程序中的最佳方式是什么(目前,在数据库端,每个SQL需要5分钟)。加载到CSV,然后在C#中读取?还有其他想法吗?
-
我计划将数据加载到c#中的HashSet中,这是个好选择吗?
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
恕我直言,这不是一个大问题。这是一个中等规模的问题,您必须处理7.5兆行。在您的示例中,这些行似乎相对较短。如果你可以访问一台RAM超过2GB的计算机,你可能可以很容易地在RAM中完成这项工作。一台典型的2011年代的笔记本电脑就可以做到这一点。几乎任何一台Winx64笔记本电脑都可以在RAM中完成。
您询问是否应该直接从数据库系统或CSV中提取数据。如果您计划在生产中使用此系统,您应该坚持使用数据库系统。这样就避免了错误地处理过时数据的可能性。
从您的问题来看,您的各种系统中的Account
值似乎完全匹配,而没有太多关于模糊匹配的麻烦。也就是说,一个账户在几个数据库中似乎被称为"1234",而在其中一个数据库中不是"1234"、在另一个数据库为"1234-001",在第三个数据库中是"A1234-2014"。这是个好消息。这意味着您可以使用诸如HashSets之类的东西在内存中处理它们。
您可能应该将系统设置为可以处理所有数据或Account
值的任意子集。例如,您可以允许将子集指定为"1000"-"1999"。这对测试来说非常方便,因为你只需要几千个账户就可以进行短期运行。这应该意味着您可以使用短时间运行的子集查询使一切正常工作。当你对一切顺利感到满意时,你可以开始生产,然后回家过夜。
请注意,如果这是一次性的工作,您也可以在您的个人计算机上安装一些DBMS(MySQL或PostgreSQL将是很好的开源选择),将各种数据库系统的各种摘录加载到其中的表中,并在它们上执行JOIN。
最后,如果你继承了未知质量的数据,谷歌会让你下载一个非常有用的数据检查和清理工具,名为OpenRefine。