代码之家  ›  专栏  ›  技术社区  ›  Jack

如何加快CSV文件处理速度?(500万条或更多记录)

  •  0
  • Jack  · 技术社区  · 17 年前

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

    以及MSFT企业图书馆4。一次读取一条记录并插入数据库。

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

    有没有办法加快这个过程?以前是否有人处理过如此大量的记录?如果有新数据需要更新,您将如何更新这些记录?

    编辑:有人能推荐一个剖析器吗?喜欢开源或免费。

    12 回复  |  直到 17 年前
        1
  •  3
  •   Joel Coehoorn    17 年前

    一次读取一条记录并插入数据库

    分批阅读并分批插入。

        2
  •  2
  •   Jon Skeet    17 年前

    使用探查器——找出时间的去向。

    如果没有真正的探查器,请尝试以下操作:

    • 一行一行地读取文件,而不做任何处理需要多长时间
    • 取一个样本行,分析它并进行所需的任何处理所需的时间,超过500万次
    • 生成随机数据并将其插入数据库,然后计时

    我猜数据库将成为瓶颈。你应该考虑批量插入——如果你一次只插入一条记录,那可能比批量插入慢得多。

        3
  •  2
  •   Mitchel Sellers    17 年前

    我在过去做过很多类似的应用程序,有很多方法可以用来优化。

    1. 确保您正在编写的代码正确地管理了内存,这里的一个小错误可能会将进程拖慢到爬行状态。

    2. 考虑将数据库调用写为异步,因为这可能是瓶颈,所以稍微排队就可以了

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

    4. 考虑使用SSIS来做导入,它已经被优化,并且做了这类事情。

        4
  •  2
  •   Konstantin Tarkus    17 年前

    为什么不直接使用Microsoft SQL Server Management Studio或命令行-SQLCMD将数据插入SQL Server数据库?它确实知道如何处理CVC文件。

    数据库上的BulkInsert属性应设置为True。

    如果必须修改,可以将其插入临时表,然后使用T-SQL应用修改。

        5
  •  1
  •   Rowland Shaw    17 年前

    最好的办法是尝试使用一个样本相对较小的分析器——这可以确定实际的滞留量在哪里。

        6
  •  0
  •   Jeff    17 年前

    将其加载到内存中,然后插入数据库。500万行不应该占用你的记忆。问题是,您实际上是在重击磁盘——读取CSV和写入DB。

        7
  •  0
  •   David Wolever    17 年前

    我会像加速任何东西一样加速它:通过一个剖析器运行它,找出最长的时间是什么。

    绝对没有办法猜测这里的瓶颈是什么——也许解析CSV文件的代码中有一个bug,导致多项式运行时?也许有一些非常复杂的逻辑用于处理每一行?谁知道呢!

    此外,对于“记录”,500万行并不是那么重——我头脑中的一个猜测是,一个合理的程序应该能够在半小时内快速完成,一个好的程序应该用更少的时间完成。

    最后,如果发现数据库是您的瓶颈,请检查每次插入后是否提交了事务。这可能会导致一些不寻常的减速。。。

        8
  •  0
  •   chris    17 年前

    不确定你在用它们做什么,但你考虑过perl吗?我最近重新编写了一个vb脚本,它也在做类似的事情——处理数千条记录——vb脚本的时间从大约一小时到perl大约15秒。

        9
  •  0
  •   Kyle B.    17 年前

    从文件中读取所有记录(我会一次读取整个文件,或以块的形式),然后使用SqlBulkCopy类将记录导入数据库。据我所知,SqlBulkCopy是导入记录块的最快方法。网上有很多教程。

        10
  •  0
  •   eglasius    17 年前

    正如其他人所建议的那样,首先对应用程序进行分析。

    也就是说,您可能会从批量插入中获益。我使用的一款应用程序就是这样,它的影响力很大。

    考虑500万次往返是非常多的,特别是如果每个都是一个简单的插入。

        11
  •  0
  •   Jason DeFontes    17 年前

    在类似的情况下,通过从一次插入一行切换到使用 SqlBulkCopy 应用程序编程接口。

    有一篇好文章 here .

        12
  •  0
  •   MrTelly    17 年前

    您需要将数据大容量加载到数据库中,前提是它具有该功能。在Sql Server中,您会看到BCP、DTS或SSI——BCP是最古老的,但可能是最快的。如果在你的数据库中这是不可能的,在运行之前关闭所有索引,我猜是数据库导致了问题,而不是数据库。Net代码。