Возвращаемые значения задачи TPL - PullRequest
1 голос
/ 21 июля 2011

У меня есть приложение для системы распознавания лиц Я получил от кадров камеры около 30:50 кадров в секунду это в зависимости от типа камеры, для каждого кадра у меня есть функция пыльника, чтобы получить всех людей на нем и от каждого человека во всех людях в текущем кадре я проверяю, существует ли этот человек в базе данных или нет. В записях базы данных содержится около 100 000 записей, это все шаги, которые я сделал навсегда, кадр

я переписываю свой предыдущий вопрос простым выражением на 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
        }
    }
}

до сих пор мое приложение работает без проблем но у меня есть пыльник, чтобы сделать эту задачу более простой и сравнительно немного времени с текущим временем. Мне нужно использовать параллельное программирование "TPL" Как: мне нужно разделить запись базы данных на 5 частей каждой части около 20000 записей и обработайте 5 частей параллельно и дождитесь окончания 5 частей и проверьте, если какая-либо часть имеет результат этого основного этого окончательного результата

но я не знаю, как внедрить эту идею, надеюсь, мой вопрос ясен

Так что, пожалуйста, если у кого-нибудь есть идея, чтобы помочь мне реализовать за эту идею я буду ему очень благодарен

Ответы [ 2 ]

0 голосов
/ 22 июля 2011

Привет всем относительно моего предыдущего вопроса, я нашел хорошее решение Я поделюсь решением для каждого лица шов моей проблемы После поиска в интернете я обнаружил, что Есть много способов разбить источник данных. В наиболее эффективных подходах несколько потоков взаимодействуют для обработки исходной последовательности источника, а не для физического разделения источника на несколько подпоследовательностей. А в .NET Framework 4 появилась новая концепция, позволяющая динамическим разделам получать дополнительную информацию Здесь и Настройка разделителей балансировки нагрузки для PLINQ Нажмите здесь

Я объясню свой вопрос с ответом на простом утверждении 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]);
                    }
                });   
            }

}
0 голосов
/ 21 июля 2011

Я не тестировал, но надеюсь, что это поможет.

// 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;
...