我写了一个类来读取CSV文件,其中包含4k条记录,72列宽。列表中的“read()”大概需要一秒钟的时间……
一旦我成功地加载了列表,我就有了将每个对象保存到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控制器结构之外构建太多的类,因为我对此还不熟悉,所以请对我从容不迫;)我假设我使用这种方法占用了宝贵的资源,这导致了指数级的处理时间问题。
对如何提高性能有什么建议吗?提前感谢!
发布于 2015-09-19 11:02:53
如果您正在使用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
发布于 2015-09-19 11:31:52
这个荣誉真的应该归功于原子指出了"AutoDetectChangesEnabled“参考。我在这里找到了Rick Strahl写的一篇很棒的文章;http://weblog.west-wind.com/posts/2013/Dec/22/Entity-Framework-and-slow-bulk-INSERTs很好地解释了这一点!
我的15分钟处理时间刚刚降到45秒!
谢谢!
https://stackoverflow.com/questions/32663623
复制相似问题