繁体   English   中英

带有大型CSV的C#交叉检查慢速数据库

[英]C# crosscheck slow database with large CSV

我有一个数据库,运行速度并不快,并且有一个大约65000行的CSV大文件。 我需要对它们进行交叉检查,并在需要时更新数据库。

  • 在CSV中,有一个包含数据库ID的列。 它始终是1:1的关系。
  • CSV可能包含数据库的新输入,因此可能没有数据库条目。
  • 我不能遍历CSV并检查每一行,因为它太慢了。
  • 首先从数据库中获取所有结果并将它们存储起来以遍历每次都行不通,因为这会占用大量RAM。

如何执行以下操作:

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

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

有什么办法可以保持速度吗?

没有足够的信息来给您适当的分析,并最终得出解决该问题的方法。 我可以给一些建议。 对于记录而言,具有65,000条记录的CSV并不是那么大。 我也不同意走文件太慢,因为我亲自使用流读取器来比较大小为千兆字节的文件,而文件大小可能要大一个数量级。

首先,您可以考虑扭转问题。 与其在CSV中运行时不拉数据库,不如考虑将整个集合拉到内存中(如果您有庞大的数据库,这不是一个好主意,但如果可管理,则是一个选择)。 如果更大一点,您甚至可以将数据库写出来(假设这是一个表或视图(或可能是视图的查询))为不同的CSV。 这里的核心焦点是使慢速数据库脱离循环。 注意:如果这是一个高度事务性的系统,并且您需要“最新(或5分钟)准确的快照”,这可能不足。 我发现这是一个不切实际的期望(也就是说,尽管进行了大量编辑,但数据现在仍代表5分钟前)。

接下来,您可以考虑减少变形。 您的问题中已经提到的一种简单方法是将工作CSV从70列减少到所需的5列。 如果您将相同的数据从数据库中拉出来进行比较,则可能同样如此。 仅当加载时间成为瓶颈时,这才有效。 根据您的描述,我非常怀疑情况是否如此。

您还可以考虑将数据的两位放入内存中并在那里进行计算。 非常快。 如果由于大小而无法将两个项目比较到内存中,则此方法将行不通,这就是为什么筛选所需的列是一个有用的练习的原因。

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

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

较晚的答案,但是我已经通过以下方式解决了:我正在将所需的CSV列拉入DataTable 然后,我获取所有需要检查的行(可以过滤的特定行数),并遍历这些数据库行。 每行将检查DataTable的相应ID,并将DataTable放入新的CSV中。 之后,DataTable中的行将被删除。 最后,我有一个包含确实存在的行的CSV,它将被导入到系统中,还有一个DataTable,它将被导出为具有需要添加的行的CSV。

感谢格雷戈里(Gregory)帮助我走上正确的道路。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM