2012-02-08 2 views
1

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

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

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

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

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

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

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

ответ

-1

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

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;

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

1

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

0

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

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

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

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

Смежные вопросы