性能调优:保存记录每500条记录呈指数级增长

本文关键字:记录 指数 500条 保存 性能 | 更新日期: 2023-09-27 18:13:31

我编写了一个类来读取包含4k记录,72 col宽的CSV文件。将'read()'读取到List只需要一秒钟,也许…

一旦我成功加载了List,我就有了将每个对象保存到db的一般流程;

foreach (var object in Objects)
{
  try{
      // check conditions
      // perform conversions on the data and assign to domain object.property
      //....
      //db.object.Add(object);
      //db.savechanges();
   }catch{
        //update log if the try fails   
   }
 }

一旦循环成功执行,我调用db.dispose();

我没有在MVC控制器结构之外构建太多的类,因为我是新的,所以对我来说很容易;)。我假设使用这种方法占用了宝贵的资源,这导致了指数级的处理时间问题。

对于如何提高性能有什么建议吗?提前感谢!

性能调优:保存记录每500条记录呈指数级增长

如果你正在使用SQL Server,并愿意使用实体框架之外的东西,有一个批量复制例程可能对你非常有用。基本上你所做的就是在内存中创建一个表(它是一个。net对象),然后将你的记录添加到其中。一旦将所有72K的记录添加到表中,就可以立即将其保存到数据库中。由于它使用了针对此场景进行了调优的批量复制功能,因此速度非常快。

这里有几篇文章可能会让你开始:

http://www.codeproject.com/Articles/16922/SQL-Bulk-Copy-with-C-Net

http://www.codeproject.com/Articles/18418/Transferring-Data-Using-SqlBulkCopy

http://dotnetmentors.com/c-sharp/bulk-upload-into-sql-server-using-sqlbulkcopy-and-c-sharp.aspx

这应该归功于Atoms指出了"AutoDetectChangesEnabled"引用。我在这里找到了Rick Strahl写的一篇很棒的文章;http://weblog.west-wind.com/posts/2013/Dec/22/Entity-Framework-and-slow-bulk-INSERTs这解释得很好!

我15分钟的处理时间被缩短到45秒!!

谢谢!