【问题标题】:Performance Tuning: Saving records exponentially grows every 500 records?性能调优:每 500 条记录保存记录呈指数增长?
【发布时间】:2015-12-16 06:54:45
【问题描述】:

我编写了一个类来读取一个包含 4k 条记录、72 列宽的 CSV 文件。列表中的“读取()”实际上需要一秒钟,也许......

成功加载列表后,我就有了将每个对象保存到数据库的一般流程;

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 控制器结构之外构建太多类,因为我是新手,所以请放轻松;)。我假设我正在使用这种导致指数处理时间问题的方法占用宝贵的资源。

关于如何提高性能的任何建议?提前致谢!

【问题讨论】:

  • 由于这是实体框架,我猜您会遇到大量对象的更改跟踪开销。有多种方法可以解决这个问题。谷歌“实体框架更改跟踪”,也许还有一些背景的“AutoDetectChangesEnabled”。
  • 谢谢,我必须调查一下。我的一般逻辑是从列表中取出一个对象并将其分配给域对象,保存,冲洗重复。我不确定为什么它会跟踪更改,因为这些是新对象。对于那些我正在检查它们是否已经存在的对象,我运行 db.model.find(),然后将列表对象中的每个值分配给“找到”的域对象。
  • 这是您引用的 Atoms 吗? weblog.west-wind.com/posts/2013/Dec/22/…

标签: c# asp.net-mvc entity-framework query-performance


【解决方案1】:

如果您正在使用 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

【讨论】:

  • 我很感激!抓取文件并将其处理到这个系统中将是一件常规的事情。我可能会坚持使用 EF 并尝试编写更好的方法...但是 def 会研究您对数据迁移的建议,谢谢。
【解决方案2】:

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

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

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    相关资源
    最近更新 更多