![](/img/trans.png)
[英]Using BlockingCollection(T) on existing IProducerConsumerCollection(T)
[英]Using multiple BlockingCollection<T> buffers in implementing pipeline validation
因此,我需要讀取一個大數據文件的每個記錄(行),然后在這些行中的每一個上應用各種驗證規則。 因此,我決定不只是應用順序驗證,而決定是否可以使用一些流水線來幫助加快處理速度。 因此,我需要對集合中的所有項目應用相同的一組業務驗證規則(目前為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);
}
}
實際上,如果我能夠以這樣一種方式來捆綁任務:一旦一個失敗,所有其他任務都停止了,那將對我有很大幫助,但是我是這種模式的新手,並且可以嘗試找出解決該問題的最佳方法問題在這里。 我是否應該謹慎行事,並讓每個驗證步驟都加載要傳遞給后續任務的輸出緩沖區? 這是更好的方法嗎?
您需要自己回答的第一個問題是您是否要提高延遲或吞吐量。
您所描述的策略采用單個項目並對其進行並行計算。 這意味着一個物品的維修速度非常快,但是卻以其他物品的輪換為代價。
考慮另一種並行方法。 您可以將整個驗證過程視為順序操作,但可以同時並行處理多個項目。
在我看來,從您的情況來看,您將從后一種方法中受益匪淺,尤其是從簡單性的角度出發,並且由於我猜想延遲在這里並不那么重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.