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

正在处理DataServiceContext?

  •  7
  • Tim  · 技术社区  · 9 年前

    我创建了一个应用程序 CSV 文件,创建 DataServiceContext 并将数据大量插入我的远程 OData API服务器。

    但是,在运行导入后5分钟 30,000 记录,我发现应用程序仍在使用750MB的内存!

    我应该做些什么来减少内存使用吗?或者至少让垃圾收集更早?它似乎没有实现 IDisposable ,我的google fu让我失望了。谢谢。

    2 回复  |  直到 8 年前
        1
  •  4
  •   mmilan    8 年前

    我在Microsoft.OData.Client上也遇到了类似的问题。看起来类似于System.Data.Services.Client.DataServiceContext的DataServiceContext类。

    发生的是,DataServiceContext有一个EntityTracker,用于跟踪对正在迭代的实体所做的任何更改。环顾四周后,我发现DataServiceContext有一个 MergeOption 所有物要解决您的问题,请将其设置为NoTracking,如下所示:

    dsc.MergeOption = MergeOption.NoTracking;
    

    这应该在开始枚举之前完成一次,无论是在构造函数中还是在循环之前的任何地方。

        2
  •  4
  •   Tim    8 年前

    如果对任何人有帮助的话,我一直在处理后使用这个来清除上下文。

    public static void ClearChanges(this DataServiceContext context)
    {
        foreach (var entity in context.Entities.ToList())
        {
            context.Detach(entity.Entity);
        }
    
        foreach (var link in context.Links.ToList())
        {
            context.DetachLink(link.Source, link.SourceProperty, link.Target);
        }
    }