2013-10-09 3 views
-1

Я написал код Java, что его время работы ужасно. Я знаю, может быть, мой код не эффективен, и я не сосредотачиваюсь на том, чтобы сделать эффективный. В это время только самое главное - быстрее работать с моим кодом. У меня есть доступ к кластеру с более чем 20 узлами. Ниже приведена схема этой части моего кода, которая занимает слишком много времени для запуска. Первые итерации цикла полностью независимы друг от друга.Запуск моего java-кода на нескольких серверах

for (int i = 0; i < 1000000; i++) { 
     for (int j = 0; j < 10000; j++) { 
      HashSet temp1 = new HashSet(); 
      for (int k = 0; k < 10; k++) { 
       HashSet temp2 = new HashSet(); 
       boolean isSubset = temp1.containsAll(temp2); 
       if (isSubset == true) { 
        BufferedReader input = new BufferedReader(new FileReader("input.txt")); 
        HashSet temp3 = new HashSet(); 
        for (int l = 0; l < 10000; l++) { 
         boolean isSubset1 = temp1.containsAll(temp3); 
        } 
       } 
      } 
     } 
    } 

Основываясь на моем базовых знаний распределенных вычислений, я могу запустить его на нескольких серверах, чтобы получить результаты быстрее, а также я думаю, что MapReduce еще одна идея. У меня нет опыта параллельной обработки. Мне нужно несколько идей и направлений, как я могу распараллелить его? Есть ли какая-нибудь платформа, чтобы сделать ее параллельной? MapReduce - хорошая идея? Надеюсь, вы можете помочь мне с некоторыми идеями, учебными пособиями или аналогичными примерами. Благодарю.

+3

10 до 11 итераций мощности - Я думаю, что вы будете нужно много машин – KevinDTimm

+0

@KevinDTimm: Вы правы! У меня есть доступ к более чем 20 серверам. Надеюсь, этого достаточно. – user2330489

+0

может быть на самом деле выше, чем я думаю, зависит от того, насколько часто «isSubset» является истинным – dardo

ответ

1

Для повышения производительности - вы должны использовать потоки

+0

Спасибо за ваш ответ. Основываясь на моих знаниях, использование потоков означает, что некоторые части моей работы будут обрабатываться одновременно в одном процессоре. Я прав? Если да, можно ли использовать потоки на нескольких подключенных серверах? – user2330489

0

Чтобы использовать MapReduce, сначала необходимо разбить проблему на подмножества, которые предоставляются фактическому процессору (Reducer). Затем они объединяются вместе после завершения обработки отображаемых входов.

Это говорит о том, что у вас больше проблем, чем бросать в него процессор, этот алгоритм очень медленный, и выяснение того, как сопоставить ввод с парами ключ-значение, которые будут использоваться с чем-то вроде Hadoop, потребует значительного рефакторинга.

Можно прочитать по основам Hadoop только из класса Mapper:

Apache Hadoop Mapper

+0

Я полностью согласен с тобой. Я ищу некоторые аналогичные примеры, чтобы получить некоторые идеи о том, как преобразовать их в задания mapreduce. – user2330489

+0

Я, конечно, считаю, что эта проблема не может быть выражена в map/reduce (несколько эффективно). Но я не вижу весь код, просто некоторые очень странные фрагменты. –

+0

@ThomasJungblut: Потому что весь код составляет около 15000 строк, а другие части достаточно быстры. – user2330489

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