2011-07-21 51 views
1

我有人脸识别系统的应用程序 我从相机帧接收约30:50帧/秒 这取决于相机类型,对于每个帧我有其他功能,以获取所有人 和从每个人在当前帧我检查这个人是否存在于数据库或数据库记录它约10万条记录,这是我所做的所有步骤帧TPL任务返回值

我用简单的C#语句重写我以前的问题更多清除

// Get All frame from Camera you can consider it's like you are inside for loop 
for (int frame = 1; frame < 50; frame++) 
{ 
    // each fram i get the person insied this frame 
    // so i get List<Persons> 
    foreach (var perosn in allPersons_inFrame) 
    {  
     // for each person i need to check 
     //against all my database recored 
     foreach (var recored in Database) 
     { 
      // perosn Exist in Database 
      // give me person id 
     } 
    } 
} 

直到现在我的应用程序没有任何问题 但我有另一个我dea使这个任务更简单,花费很少的时间比较 与当前所用时间。我需要使用并行编程“TPL” 如何:我需要分裂数据库记录5部分大约20,000记录 ,处理5件并行的方式各部分,等到五个部分的完成 并检查是否有任何部分已导致这主要这个最终结果

,但我不知道我是怎么植入这个想法我希望我的问题是明确的

所以,如果任何人有一个想法来帮助我实现 这个想法我会b非常感谢他

回答

0

我没有测试,但希望它有帮助。

// define your logic here. 
Func<IEnumerable<Person>, string> YourLogicHere = null; 
// define the way to compare your task result here. 
Func<IEnumerable<Task<string>>, string> DealWithTheTaskResultsHere = null; 
Collection<Person> persons = new Collection<Person>(); 
Task<string> mainTask = new Task<string>(tmpObj => 
    { 
     var tmpPersons = tmpObj as Collection<Person>; 
     if (tmpPersons != null) 
     { 
      int interval = (int)Math.Ceiling(tmpPersons.Count/5d); 
      int index = 0; 
      Collection<Task<string>> subTasks = new Collection<Task<string>>(); 
      while (index < tmpPersons.Count) 
      { 
       Task<string> subTask = new Task<string>(
        (tmpSubPersons) => { return YourLogicHere((IEnumerable<Person>)tmpSubPersons); }, 
        tmpPersons.Skip(index).Take(interval).ToArray(), TaskCreationOptions.AttachedToParent); 
       index += interval; 
       subTasks.Add(subTask); 
      } 

      foreach (var subTask in subTasks) 
      { 
       subTask.Start(); 
      } 

      foreach (var subTask in subTasks) 
      { 
       subTask.Wait(); 
      } 

      return DealWithTheTaskResultsHere(subTasks); 
     } 
     else return String.Empty; 
    }, persons); 

mainTask.Start(); 
mainTask.Wait(); 
return mainTask.Result; 
0

大家好关于我刚才的问题我找到很好的解决办法 我会分享给大家脸上缝解决我的问题,我 互联网上搜索后,我发现, 有很多方法来划分的数据源。在最有效的方法中,多个线程协作处理原始源序列,而不是将源物理分离为多个子序列。而在.NET Framework 4中有新的概念可以动态分区以获取更多信息Here并配置负载平衡Partitioners为PLINQ Click Here

我解释我的简单的C#语句回答问题更清晰。

// Get All frame from Camera you can consider it's like you are inside for loop 
for (int frame = 1; frame < 50; frame++) 
{  
    // first enhanced i process all persons in parallel way -- new enhanced 

    Parallel.ForEach(allPersons_inFrame, perosn => 
      { 

       //second enhanced Partition the entire data source 
       var rangePartitioner = Partitioner.Create(0, source.Length); 

       List<results> lstResult=new List<results>(); 

       // Loop over the partitions in parallel. 
       Parallel.ForEach(rangePartitioner, (range, loopState) => 
       { 
        // Loop over each range element without a delegate invocation. 
        for (int i = range.Item1; i < range.Item2; i++) 
        { 
         // make any spacfic check to get you result 
          lstResult.Add(source[i]); 
        } 
       }); 
      } 

}