要求:我有多个数据库(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
答案 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。