0

因此,我需要读取大型数据文件的每条记录(行),然后在每一行上应用各种验证规则。因此,我决定不只是应用顺序验证,而是决定看看是否可以使用一些流水线来帮助加快速度。因此,我需要将同一组业务验证规则(目前为 5 个)应用于我的集合中的所有项目。由于不需要从每个验证过程返回输出,因此我无需担心将值从一个验证例程传递到另一个验证例程。但是,我确实需要为我的所有验证步骤提供相同的数据,为此,我想出了将相同的数据(记录)处理到 5 个不同的缓冲区,每个验证阶段都将使用这些缓冲区。

下面是我要去的代码。但是我对这个应用没什么信心,想知道是否有更好的方法可以做到这一点?感谢您对此提供的任何帮助。提前致谢。

public static void LoadBuffers(List<BlockingCollection<FlattenedLoadDetail>> outputs,
            BlockingCollection<StudentDetail> students)
        {
            try
            {
                foreach (var student in students)
                {
                    foreach (var stub in student.RecordYearDetails)
                        foreach (var buffer in outputs)
                            buffer.Add(stub);
                }
            }
            finally
            {
                 foreach (var buffer in outputs)
                     buffer.CompleteAdding();
            }

        }


    public void Process(BlockingCollection<StudentRecordDetail> StudentRecords)
    {

        //Validate header record before proceeding

        if(! IsHeaderRecordValid)
            throw new Exception("Invalid Header Record Found.");
        const int buffersize = 20;
        var buffer1 = new BlockingCollection<FlattenedLoadDetail>(buffersize);
        var buffer2 = new BlockingCollection<FlattenedLoadDetail>(buffersize);
        var buffer3 = new BlockingCollection<FlattenedLoadDetail>(buffersize);
        var buffer4 = new BlockingCollection<FlattenedLoadDetail>(buffersize);
        var taskmonitor = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.NotOnCanceled);

        using (var loadUpStartBuffer = taskmonitor.StartNew(() => LoadBuffers(
            new List<BlockingCollection<FlattenedLoadDetail>>
            {buffer1, buffer2, buffer3, buffer4}, StudentRecords)))
        {
            var recordcreateDateValidationStage = taskmonitor.StartNew(() => ValidateRecordCreateDateActivity.Validate(buffer1));
            var uniqueStudentIDValidationStage =
                taskmonitor.StartNew(() => ValidateUniqueStudentIDActivity.Validate(buffer2));
            var SSNNumberRangeValidationStage =
                taskmonitor.StartNew(() => ValidateDocSequenceNumberActivity.Validate(buffer3));
            var SSNRecordNumberMatchValidationStage =
                taskmonitor.StartNew(() => ValidateStudentSSNRecordNumberActivity.Validate(buffer4));

            Task.WaitAll(loadUpStartBuffer, recordcreateDateValidationStage, uniqueStudentIDValidationStage,
                SSNNumberRangeValidationStage, SSNRecordNumberMatchValidationStage);

        }
    }

事实上,如果我能以这样一种方式捆绑任务,一旦一个失败,所有其他人都停止,那将对我有很大帮助,但我是这种模式的新手,并且试图找出处理这个问题的最佳方法我在这里遇到的问题。我是否应该小心翼翼地让每个验证步骤都加载一个输出缓冲区以传递给后续任务?这是一个更好的方法吗?

4

1 回答 1

0

您需要自己回答的第一个问题是您是否想提高延迟或吞吐量。

您描述的策略采用单个项目并对其执行并行计算。这意味着一个项目的服务速度非常快,但代价是其他等待轮到他们进入的项目。

考虑另一种并发方法。您可以将整个验证过程视为一个顺序操作,但同时并行处理多个项目。

在我看来,在您的情况下,您将从后一种方法中受益更多,特别是从简单性的角度来看,因为我猜测延迟在这里并不那么重要。

于 2013-11-06T22:02:07.267 回答