параллельная обработка с циклическим построением в Java - PullRequest
1 голос
/ 08 февраля 2012

Я работаю над созданием crawler - веб-приложения на java, в котором пользователи могут определять задания на сканирование, которые извлекают и хранят информацию с определенных веб-сайтов.

Как часть этой работы, существует конструкция 'loop' ... она имеет часть списка, которая первоначально оценивается (и обычно представляет собой список значений) ... После этого идет тело цикла, которое выполняется один раз для каждого элемента в списке (из части списка, упомянутой ранее).

Обратите внимание, что внутри другой конструкции цикла может быть конструкция цикла и т. Д.

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

Что я хочу сделать, так это для одноуровневого цикла сначала рассчитать значение списка и сохранить его в базе данных. После этого вместо выполнения тела за один раз разделите его на разные секции, чтобы разные секции списка обрабатывались параллельно.

Однако, как мне разделить задание на n-уровневый цикл? (Т. Е. Один цикл внутри одного цикла и т. Д.)

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

Ответы [ 4 ]

1 голос
/ 08 февраля 2012

Я предлагаю упаковать логику обработки для 1 элемента списка в Runnable или Callable, а затем передать их Executor для выполнения.Это будет запускать задачи параллельно в разных рабочих потоках.Конечно, это зависит от того, сколько ядер у вашей машины, насколько «параллельно» это будет на самом деле.Если каждый элемент списка может быть обработан полностью независимо от всех остальных, то для меня это будет путь, вместо того, чтобы возиться с потоками, делить список на подсписки и т. Д.

0 голосов
/ 08 февраля 2012

Звучит как отличный кандидат для Java 7 fork / join Framework

0 голосов
/ 08 февраля 2012

Согласно вашему описанию, я получил, что вы получаете исходный код веб-сайта xyz и извлекаете данные из него.

Вы можете использовать XPath и RegularExpression, чтобы выполнить эту задачу как можно лучше.используйте для этого JSOUP, это вам очень поможет.

Что касается параллелизации, вы можете использовать .select, getElementbyId, getElementByClass из JSOUP (это открытый код).чем просто поставить

for(i=0 ;i< length;i++)
{   

    i am fetching i;
    i am fetching i+1;
    int temp=i+1;
    if(temp>=length)
    {  
        break;
    }
}

надеюсь, это поможет: http://jsoup.org

0 голосов
/ 08 февраля 2012

Допустим, вы создали 3 потока: T1, T2, T3. и следующее - это циклическая конструкция, например,

for(int i=0; i<100; i++)
{
    for(int j=0; j<100; j++)
    {
        for(int k=0; k<100; k++)
        {
            // do some processing.
        }
    }
}

Изменить инкрементную часть как i += no. of threads. В этом случае это будет i += 3

Таким образом, начальные значения i, j, k будут варьироваться для каждого потока.

Для T1: i = 0;

Для T2: i = 1;

Для T3: i = 2;

Аналогично может быть установлен предел цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...