如果我的问题中有任何不清楚的地方,请告诉我如何让它变得更好。我是这个论坛的新人,所以对于任何错误都要提前道歉。
我正在对一些金融工具进行计算。对于他们每个人,我有两个单独的文件 - 一个包含给定市场上的交易记录,第二个是订单簿的当前状态(bidask大小和价格)。由于文件很大,我需要在每次计算时加载一行数据文件。出于同样的原因,将文件合并在一起也不是一个好主意。
我的问题是,如何使用两个StreamReader(或任何其他方式?)来执行以下计算:
对于一个文件来说,它非常简单。计算如下:
string[] ListOfRawData = Directory.GetFiles(...);
Parallel.ForEach
(
ListOfRawData,
new ParallelOptions { MaxDegreeOfParallelism = 8 },
(FileName) =>
{
SupportMethods Support = new SupportMethods(FileName);
List<Calculation> CalculationInstances = new List<Calculation>();
using (StreamReader DataFile = new StreamReader(FileName))
{
while (!DataFile.EndOfStream)
{
// Determine whether the line is new trade or an orderbook update
Support.TradeOrUpdate(DataFile);
switch (Support.IsTrade)
{
case false:
foreach (Calculation ActualCalculation in CalculationInstances)
{
ActualCalculation.DOMUpdateMethod(DMUpdate, Support);
}
break;
case true:
foreach (Calculation ActualCalculation in CalculationInstances)
{
ActualCalculation.TradeUpdateMethod(TradeUpdate, Support);
}
break;
default:
break;
}
}
}
}
);
我想执行相同的计算,但现在从两个单独的文件加载。
在我的搜索过程中,我读到使用两个流式读取器需要两个独立的线程 - 是吗?这是一个问题吗,因为我使用Parallel.ForEach同时为多个线程上的8个不同的乐器运行上述计算?
两个文件都由时间戳标识如下:
交易档案:
02-JAN-2007,08:21:13.173,+1,Trade,40.6,1000,40.6800 (...)
02-JAN-2007,08:21:16.379,+1,Trade,40.6,130,40.6800 (...)
订单簿文件:
02-JAN-2007,08:21:13.274,+1,Market Depth,40.6,4000,1,40.7,4731,3, (...)
02-JAN-2007,08:21:17.345,+1,Market Depth,40.6,3870,1,40.7,4731,3, (...)
任何想法或链接都将受到赞赏。
编辑:我感兴趣的代码部分介于&#34;使用Streamreader&#34;和&#34; swich&#34;声明。 parallel.foreach可能会令人困惑,我只是为了完整而添加它。
答案 0 :(得分:1)
您似乎在寻找合并连接算法。它需要两个排序的序列,并将它们合并到一个常量内存中。如果您不想自己动手,可以在网上找到这样的算法。
代码看起来像:
IEnumerable<...> src1 = GetSource1();
IEnumerable<...> src2 = GetSource2();
IEnumerable<...> merged = Merge(src1, src2, x => x.GetTimeStamp(), x => x.GetTimeStamp());
merged
.AsParallel()
.ForEach(x => PerformUpdate(x));
这使得单文件读取文件并处理多线程的连接结果。