性能调优:保存记录每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控制器结构之外构建太多的类,因为我是新的,所以对我来说很容易;)。我假设使用这种方法占用了宝贵的资源,这导致了指数级的处理时间问题。
对于如何提高性能有什么建议吗?提前感谢!如果你正在使用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秒!!
谢谢!