我写了一个VB.net控制台程序来处理文本文件中的CSV记录。我正在使用FileHelpers library
以及MSFT Enterprise库4.一次读取记录并插入数据库。
在文本文件上处理500多万条记录需要大约3-4个小时。
无论如何加速这个过程?有没有人处理过如此大量的记录?如果有新的数据要更新,你会如何更新这些记录?
编辑:有人可以推荐一个探查器吗?喜欢开源或免费。
答案 0 :(得分:3)
当时读取记录并插入数据库
分批阅读并分批插入。
答案 1 :(得分:2)
使用分析器 - 找出时间的去处。
如果没有真正的分析器,请尝试以下方法:
我的猜测是数据库将成为瓶颈。您应该考虑进行批量插入 - 如果您一次只插入一条记录,那么这可能比批量插入慢得多。
答案 2 :(得分:2)
过去我做过很多像这样的应用程序,你可以通过多种方式来优化。
确保您正在编写的代码正确管理内存,这样的一个小错误可能会使进程变慢。
考虑将数据库调用写成Async,因为它可能是瓶颈,所以排队可能没问题
考虑删除索引,然后执行导入,然后重新导入。
考虑使用SSIS进行导入,它已经过优化,可以解决这个问题。
答案 3 :(得分:2)
为什么不直接使用Microsoft SQL Server Management Studio或命令行将数据直接插入SQL Server数据库 - SQLCMD?它确实知道如何处理CVC文件。
数据库上的BulkInsert属性应设置为True。
如果必须修改,可以将其插入Temprorary表,然后使用T-SQL应用修改。
答案 4 :(得分:1)
最好的办法是尝试使用一个样本相对较少的分析器 - 这可以确定实际停留的位置。
答案 5 :(得分:0)
我会加快速度,就像我加快速度一样:通过剖析器运行它并找出最长的时间。
绝对没有办法猜测这里的瓶颈是什么 - 可能代码中有一个错误解析CSV文件,导致多项式运行时?也许有一些非常复杂的逻辑用于处理每一行?谁知道!
另外,对于“记录”来说,500万行并不是那么重 - 一个不可思议的猜测说,一个合理的程序应该能够在半个时间内流失小时,一个不错的好节目。
最后,如果您发现数据库是您的瓶颈,请检查每次插入后是否正在提交事务。这可能会导致一些不平凡的放缓......
答案 6 :(得分:0)
将其加载到内存中,然后插入数据库。 500万行不应该对你的记忆征税。问题是你实际上正在颠覆你的磁盘 - 既读取CSV又写入数据库。
答案 7 :(得分:0)
不确定你在做什么,但是你考虑过perl吗?我最近重写了一个类似的东西的vb脚本 - 处理成千上万的记录 - 时间从vb脚本的大约一个小时到perl的大约15秒。
答案 8 :(得分:0)
从文件中读取所有记录(我将在一次传递或块中读取整个文件),然后使用SqlBulkCopy类将您的记录导入数据库。据我所知,SqlBulkCopy是导入记录块的禁区方法。网上有很多教程。
答案 9 :(得分:0)
正如其他人所建议的那样,首先对应用进行了分析。
那就是说,你可能会从批量插入中获益。这是我工作的一个应用程序的情况,这是一个很大的影响。
考虑500万往返很多,特别是如果它们都是一个简单的插入。
答案 10 :(得分:0)
在类似的情况下,我们通过从一行一次的插入切换到使用SqlBulkCopy API,看到了相当大的性能提升。
有一篇好文章here。
答案 11 :(得分:0)
您需要将数据批量加载到数据库中,假设它具有该功能。在Sql Server中你会看到BCP,DTS或SSIS - BCP是最老的但可能是最快的。 OTOH如果你的数据库中不可能在运行之前关闭所有索引,我猜这是造成问题的数据库,而不是.Net代码。