首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架保存7500个条目所需时间

实体框架保存7500个条目所需时间
EN

Stack Overflow用户
提问于 2015-07-23 16:22:51
回答 1查看 84关注 0票数 0

我有两个名为信号和数据的实体类:

代码语言:javascript
运行
复制
public class Data
{
    public Data()
    {
    }

    public int DataID { get; set; }

    public double ElapsedTime { get; set; }
    public double X { get; set; }
    public double Y { get; set; }
    public double Value { get; set; }
}

public class Signal
{
    public Signal()
    {
        Data = new List<Data>();
    }

    public int SignalID { get; set; }

    public string Name { get; set; }
    public string Units { get; set; }
    public virtual List<Data> Data { get; set; }
}

在正常操作期间,我初始化数据库上下文并创建必要的信号(其中12个),然后释放上下文。

稍后,从硬件中获取数据,我再次初始化上下文,创建数据对象,并将它们添加到适当的信号中。采集开始和停止,但在整个过程中,我们结束了625个数据点,每个信号(总共7500个数据点),在几个短时间内爆发约10秒。我有一个单独的线程负责将数据保存到数据库,希望它不会落后于获取线程。然而,在采集完成后,需要6-7分钟才能完成数据的保存。

下面是每100个数据对象被调用的代码。我们将字典从获取线程中排掉。字典将信号与需要添加到它们的下100个数据对象相匹配。然后我们从数据库中获取匹配的信号,并添加适当的数据。

代码语言:javascript
运行
复制
// Dequeue the next set of data to save 
Dictionary<Signal, List<Data>> dataToSave = null;
while (MeasurementDataToSaveQueue.TryDequeue(out dataToSave) == false && MeasurementDataToSaveQueue.Count > 0)
    if (SequenceAborted || SequenceInProgress == false) break;

if (dataToSave != null && dataToSave.Count > 0)
{
    foreach (var pair in dataToSave)
    {
        Signal signal = dbContext.Signals.FirstOrDefault(S => S.SignalID == pair.Key.SignalID);
        signal.Data.AddRange(pair.Value);
    }
}

以上代码每次通话花费10-20毫秒,并与收购保持良好的同步。但是,一旦所有7500个数据对象都被添加到适当的信号中,我就调用dbContext.SaveChanges(),这需要几分钟时间。每次代码运行时,我都试着保存,每个单独的保存都更快,但是总时间仍然是6-7分钟。有办法加快速度吗?似乎不应该花那么长时间更新7500张唱片。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-23 16:31:30

使用EntityFramework.BulkInsert可以显著提高性能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31592966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档