使用大型CSV的C#crosscheck慢速数据库

时间:2012-12-10 14:10:24

标签: c# database csv streamreader

我有一个数据库,速度不是很快,我有一个大约65000行的大CSV。我需要交叉检查这些存在并在需要时更新数据库。

  • 在CSV中,有一列包含数据库ID。它始终是1:1的关系。
  • CSV可能会保留数据库的新输入,因此可能会发生没有数据库条目。
  • 我无法遍历CSV并检查每一行,因为它太慢了。
  • 首先从数据库中获取所有结果并将它们存储到每次循环都不起作用,因为这样会拉出大量的RAM。

如何执行以下操作:

  • 检查CSV中的行是否有数据库条目。如果是这样,请将其写入另一个CSV文件。
  • 如果该行没有数据库条目,请将其写入其他文件。
  • 将时间间隔保持在5分钟内,最好是更短。

CSV有很多列(例如70),但我只需要第5列来交叉检查ID。我试图首先遍历CSV文件,然后用数据库检查它,但这太慢了。可能需要10多分钟。我也尝试从数据库中获取所有条目,并循环遍历这些条目。使用循环,运行CSV(使用BufferedStream)并进行检查。这确实会显着减少时间(最多5分钟),但无法记录数据库中不存在的条目。

在保持加速的同时,我有什么方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

没有足够的信息可以为您提供正确的分析,并最终得到解决问题的解决方案。我可以提出一些建议。对于记录,具有65,000条记录的CSV并不是那么大。我也不同意走路文件的速度太慢,因为我亲自使用流式读取器来比较大小为千兆字节的文件,这可能会大一个数量级。

首先,您可以考虑解决问题。不要在运行CSV时浏览数据库,而是考虑将整个集合拉入内存(如果你有一个庞大的数据库,那么这不是一个好主意,但如果它是可管理的,那么这是一个选择)。如果稍微大一些,您甚至可以写出数据库(假设这是一个表或视图(或可能是视图的查询))到另一个CSV。这里的核心焦点是让慢速数据库脱离循环。注意:如果这是一个高度事务性的系统,并且您需要“最快(或5分钟)准确的快照”,这可能还不够。我发现这是一个不切实际的期望(数据现在仍然代表5分钟前,尽管有很多编辑,但是)。

接下来,您可以考虑减少设置。在您的问题中已经提到的一种简单方法是将工作CSV从70列减少到您需要的5列。如果从数据库中提取相同的数据进行比较,情况也是如此。这只有在加载时间成为瓶颈的情况下才有效。根据你的描述,我严重怀疑是这种情况。

您还可以考虑将两位数据放入内存并在那里进行计算。非常快。如果由于大小而无法将两个项目与内存进行比较,这将无效,这就是为什么过滤到您需要的列是一个有用的练习。

由于您提到数据库ID,听起来像CSV检查多个数据库。考虑首先按数据库ID排序CSV。如上所述,有一些排序算法非常快,应该能够在几秒钟内对65,000条记录进行排序。排序的瓶颈通常是内存量和I / O速度(主要是磁盘速度)。然后,您可以攻击每个数据库。

正如我在开始时所说,我只有足够的信息来提供提示,而不是实际的解决方案,但希望这能激发一些想法。

答案 1 :(得分:0)

迟到的答案,但我已经这样解决了:我将我需要的CSV列拖到{​​{1}}。然后我获取我需要检查的所有行(它有一定数量我可以过滤),并运行这些数据库行。每行将检查DataTable中的相应ID,并将数据放入新的CSV中。之后,DataTable中的行将被删除。最后,我有一个CSV,其中包含确实存在的行并将导入系统,以及一个DataTable,它将导出到包含需要添加的行的CSV。

感谢格雷戈里帮助我走上正轨。