我有一个数据库,速度不是很快,我有一个大约65000行的大CSV。我需要交叉检查这些存在并在需要时更新数据库。
如何执行以下操作:
CSV有很多列(例如70),但我只需要第5列来交叉检查ID。我试图首先遍历CSV文件,然后用数据库检查它,但这太慢了。可能需要10多分钟。我也尝试从数据库中获取所有条目,并循环遍历这些条目。使用循环,运行CSV(使用BufferedStream
)并进行检查。这确实会显着减少时间(最多5分钟),但无法记录数据库中不存在的条目。
在保持加速的同时,我有什么方法可以做到这一点?
答案 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。
感谢格雷戈里帮助我走上正轨。