我有两个名为信号和数据的实体类:
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个数据对象相匹配。然后我们从数据库中获取匹配的信号,并添加适当的数据。
// 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张唱片。
谢谢你的帮助。
发布于 2015-07-23 16:31:30
使用EntityFramework.BulkInsert可以显著提高性能。
https://stackoverflow.com/questions/31592966
复制相似问题