你如何加快CSV文件进程? (500万或更多记录)

时间:2009-03-31 20:36:28

标签: vb.net csv

我写了一个VB.net控制台程序来处理文本文件中的CSV记录。我正在使用FileHelpers library

以及MSFT Enterprise库4.一次读取记录并插入数据库。

在文本文件上处理500多万条记录需要大约3-4个小时。

无论如何加速这个过程?有没有人处理过如此大量的记录?如果有新的数据要更新,你会如何更新这些记录?

编辑:有人可以推荐一个探查器吗?喜欢开源或免费。

12 个答案:

答案 0 :(得分:3)

  

当时读取记录并插入数据库

分批阅读并分批插入。

答案 1 :(得分:2)

使用分析器 - 找出时间的去处。

如果没有真正的分析器,请尝试以下方法:

  • 一段一线地读取文件所需的时间,而不用任何操作
  • 采取一个样本行,并计算解析它所需的时间,并进行所需的任何处理,500万次
  • 生成随机数据并将其插入数据库,并将其插入

我的猜测是数据库将成为瓶颈。您应该考虑进行批量插入 - 如果您一次只插入一条记录,那么这可能比批量插入慢得多。

答案 2 :(得分:2)

过去我做过很多像这样的应用程序,你可以通过多种方式来优化。

  1. 确保您正在编写的代码正确管理内存,这样的一个小错误可能会使进程变慢。

  2. 考虑将数据库调用写成Async,因为它可能是瓶颈,所以排队可能没问题

  3. 考虑删除索引,然后执行导入,然后重新导入。

  4. 考虑使用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代码。