我需要一些建议。我有一个应用程序处理来自股票exachanges的实时数据馈送的交易信息。我的处理工作落后了。
由于我在拥有32 GB主内存的3GHz Intel I7上运行,因此我应该有足够的电量来执行此应用程序。 Parse例程将交易信息存储在运行于Windows 2012 R2 Server的SQL Server 2014数据库中。
我将以下时序信息放在主处理循环中:
invokeTime.Restart();
Parallel.Invoke(() => parserObj.Parse(julian, data));
invokeTime.Stop();
var milliseconds = invokeTime.ElapsedMilliseconds;
if (milliseconds > maxMilliseconds) {
maxMilliseconds = milliseconds;
messageBar.SetText("Invoke: " + milliseconds);
}
我得到了1122毫秒来做Parallel.Invoke。类似的定时测试表明,Parse例程只需要7毫秒(最大值)。
除了执行Parallel.Invoke?
之外,还有更好的处理数据的方法吗?任何建议都将不胜感激。
查尔斯
答案 0 :(得分:0)
你试过吗
Task.Factory.StartNew(() => {
parserObj.Parse(julian, data));
});
你的Parse方法怎么样?也许瓶颈就在那里......
答案 1 :(得分:0)
在Stephen Toub的文章中:http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx他描述:“Task.Run可以而且应该用于简单卸载一些要在ThreadPool上处理的工作的最常见情况”。这正是我想要做的,将Parse rosutine卸载到后台线程。所以我改变了:
Parallel.Invoke(()=> parserObj.Parse(julian,data));
为:
Task.Run(()=> parserObj.Parse(julian,data));
我还通过执行以下操作将ThreadPool中的线程数从8增加到80:
int minWorker, minIOC;;
ThreadPool.GetMinThreads(out minWorker, out minIOC);
var newMinWorker = 10*minWorker;
var newMinIOC = 10*minIOC;
if (ThreadPool.SetMinThreads(newMinWorker, newMinIOC)) {
textBox.AddLine("The minimum no. of worker threads is now: " + newMinWorker);
} else {
textBox.AddLine("Drat! The minimum no. of worker threads could not be changed.");
}
解析循环运行6个半小时/天,如下所示:
var stopWatch = new Stopwatch();
var maxMilliseconds = 0L;
while ((data = GetDataFromIQClient()) != null) {
if ( MarketHours.IsMarketClosedPlus2() ) {
break;
}
stopWatch.Restart();
Task.Run(() => parserObj.Parse(julian, data));
stopWatch.Stop();
var milliseconds = stopWatch.ElapsedMilliseconds;
if (milliseconds > maxMilliseconds) {
maxMilliseconds = milliseconds;
messageBar.SetText("Task.Run: " + milliseconds);
}
}
现在,调用Task.Run所花费的最长时间是96毫秒,而在解析器上花费的最长时间是18毫秒。我现在正在跟上数据传输。
查尔斯