实体框架需要几分钟保存7500个条目
本文关键字:保存 几分钟 7500个 分钟 框架 实体 | 更新日期: 2023-09-27 18:04:13
我有一对称为信号和数据的实体类:
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个),然后处置上下文。
稍后,从硬件获取数据,我再次初始化上下文,创建data对象,并将它们添加到适当的Signal中。采集开始和停止,但在整个过程中,我们最终在几个短爆发中获得每个信号625个数据点(总共7500个数据点),总共大约10秒。我有一个单独的线程负责将数据保存到数据库中,希望它不会远远落后于获取线程。但采集完成后,数据保存需要6 ~ 7分钟。
下面是每100个数据对象调用的代码。我们将字典从获取线程中取出。字典将信号与需要添加到信号中的下100个数据对象进行匹配。然后,我们从数据库中获取匹配的信号,并添加适当的数据。
// 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-20ms,并且可以很好地跟上采集。但是,一旦将所有7500个数据对象添加到适当的信号中,我调用dbContext.SaveChanges()
,这需要几分钟的时间。我尝试在每次代码运行时都保存,每次保存都更快,但总时间仍然是6-7分钟。有什么办法能加快速度吗?更新7500条记录似乎不应该花那么长时间。
谢谢你的帮助。
Using EntityFramework。BulkInsert应该能显著提高性能