多线程计算从多个文件加载数据。如何在C#中使用和同步StreamReader?

时间:2016-10-09 09:01:58

标签: c# multithreading streamreader

如果我的问题中有任何不清楚的地方,请告诉我如何让它变得更好。我是这个论坛的新人,所以对于任何错误都要提前道歉。

我正在对一些金融工具进行计算。对于他们每个人,我有两个单独的文件 - 一个包含给定市场上的交易记录,第二个是订单簿的当前状态(bidask大小和价格)。由于文件很大,我需要在每次计算时加载一行数据文件。出于同样的原因,将文件合并在一起也不是一个好主意。

我的问题是,如何使用两个StreamReader(或任何其他方式?)来执行以下计算:

  1. 加载两行
  2. 根据时间戳确定哪个首先出现
  3. 对第一个执行计算并将第二个保存为临时
  4. 加载计算文件的另一行
  5. 与temp(步骤2)进行比较
  6. 重复
  7. 对于一个文件来说,它非常简单。计算如下:

    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可能会令人困惑,我只是为了完整而添加它。

1 个答案:

答案 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));

这使得单文件读取文件并处理多线程的连接结果。