C#使用大型CSV交叉检查慢速数据库

C#使用大型CSV交叉检查慢速数据库,c#,database,csv,streamreader,C#,Database,Csv,Streamreader,我有一个数据库,速度不是很快,我有一个大约65000行的大CSV。我需要交叉检查这些数据库是否存在,并在需要时更新数据库 在CSV中,有一列包含数据库ID。这总是一对一的关系 CSV可能保存数据库的新输入,因此可能没有数据库条目 我无法循环CSV并检查每一行,因为它太慢了 首先从数据库中获取所有结果并将其存储起来以便每次循环使用是行不通的,因为这样会占用大量RAM 我怎样才能做到以下几点: 检查CSV中的行是否有数据库条目。如果是,请将其写入另一个CSV文件 如果该行没有数据库条目,请将其

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

  • 在CSV中,有一列包含数据库ID。这总是一对一的关系
  • CSV可能保存数据库的新输入,因此可能没有数据库条目
  • 我无法循环CSV并检查每一行,因为它太慢了
  • 首先从数据库中获取所有结果并将其存储起来以便每次循环使用是行不通的,因为这样会占用大量RAM
我怎样才能做到以下几点:

  • 检查CSV中的行是否有数据库条目。如果是,请将其写入另一个CSV文件
  • 如果该行没有数据库条目,请将其写入其他文件
  • 将时间跨度保持在5分钟以内,最好更短
CSV有很多列(例如70列),但我只需要第5列来交叉检查ID。我尝试先循环CSV文件,然后用数据库检查它,但速度太慢了。这可能需要10分钟以上。我还尝试从数据库中获取所有条目,并循环这些条目。使用循环,运行CSV(使用
BufferedStream
),并检查它。这确实会显著减少时间(最多5分钟),但将无法记录数据库中不存在的条目


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

没有足够的信息为您提供适当的分析,并最终找到解决问题的铁板一块的解决方案。我可以提出一些建议。就记录而言,拥有65000条记录的CSV并没有那么大。我也不同意文件移动速度太慢的说法,因为我个人曾使用streamreader来比较大小为千兆字节的文件,而这些文件很可能要大一个数量级

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

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

<>你也可以考虑把这两个数据位放入内存并计算。非常快。如果由于大小的原因无法将这两个项目比较到内存中,那么这将不起作用,这就是为什么向下过滤到所需的列是一个有用的练习

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


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

迟来的回答,但我已经这样做了:我正在将我需要的CSV列拉入
数据表中。然后我获取我需要检查的所有行(它有一个我可以过滤的特定数字),并运行这些数据库行。每行将在
数据表中检查相应的ID,并将数据放入新的CSV中。之后,数据表中的行将被删除。最后,我有一个CSV,其中包含确实存在并将导入系统的行,还有一个DataTable,它将导出为CSV,其中包含需要添加的行


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

这是一个什么样的数据库?如果它是关系数据库,并且数据库上的索引设置正确,那么通过表中的id进行选择/更新应该很快。您对CSV有什么控制?你能剪掉数据库中出现的记录吗?数据库ID列是否遵循可以利用的约定以节省时间?e、 g.你能把所有比上次添加到数据库中的ID都少的ID都删掉吗?@JohnKoerner这不是我的数据库,我无法编辑它。它对我来说是只读的。我想索引设置得不是很好,或者根本不是。我必须通过ODBC连接器进行连接。@Rawrgramming CSV是客户端的。作为保护,我可以复制然后编辑,所以是的,我可以完全控制CSV。但行没有排序,ID可能被置乱。这只是一个数据库,如果我不清楚的话,很抱歉。数据库应该保留相同数量的行,因为文件应该只更新/添加。是否有65k或最终100k行大到可以放入内存,或者任何计算机都可以处理得那么好?另外,您还需要什么其他信息来进行适当的分析?