Могу ли я иметь потоки внутри функции карты? У меня есть задача, чтобы темы могли мне помочь. Мне нужно одновременно добавить значения в hashmap для каждой строки ввода. Моя строка ввода становится массивом строк, и для каждого значения этого массива мне нужно добавить его в хэш-карту. Позже я использую этот hashmap в функции очистки.
Я делаю это с помощью цикла for, и кажется, что это узкое место для моего проекта. Поэтому я подумал об использовании одновременной хэш-карты и разделении массива строк на несколько меньших массивов. Таким образом, каждый поток будет отвечать за добавление соответствующего «меньшего» массива в hashmap. Дело в том, что я реализовал его в локальном Java-приложении, и оно работает. Когда я использую его внутри Hadoop, результаты не ожидаемые. Я использую Thread.join () для каждого потока, так что для каждой строки ввода я проверяю, что потоки закончили до следующей строки. Ну, это то, что я думал, что сделал. Обрабатывает ли hadoop потоки особым образом?
edits for duffymo
Вот гугл цитата http://research.google.com/pubs/pub36296.html.
Алгоритм 2 - это та часть, о которой я говорю. Как видите, для каждого атрибута есть цикл for, а для каждого атрибута мне нужно обновить структуру памяти. Они должны прогнозировать только одно значение в своем подходе (обучение по одной метке), в моем случае у меня может быть много значений для прогнозирования (обучение по нескольким меткам). Итак, что говорит Google значение y, для них это массив из 3 значений. Для меня это может быть до тысячи. Агрегирование двух 3-мерных векторов происходит намного быстрее, чем агрегация двух 10000-мерных векторов.
Если я добавлю в алгоритм только одну метку, у меня вообще не будет никаких проблем. 45 секунд, которые я упомянул, уменьшены до менее 5. Так что да, он работает правильно только для одной метки.
45 секунд, которые я упомянул, предназначены только для цикла for. Я не считал разбор и все остальное. Цикл for наверняка является узким местом, поскольку это единственное, что я измеряю, и это занимает около 45 секунд, в то время как вся задача занимает около 1 минуты (включая инициализацию задачи и многое другое). Я хочу попробовать и разбить этот цикл for на 2 или 3 меньших цикла for и обрабатывать их одновременно. Попытка означает, что это может работать и что это может не работать. Иногда такие сумасшедшие вещи, как я упомянул, могут быть необходимостью. Хорошо, это то, что уважаемый программист рассказал мне в предыдущей ветке о hadoop.
Раньше я не предоставлял эти подробности, так как думал, что мне нужно только мнение о hadoop и потоках внутри функции карты. Не думал, что кто-то так сильно меня спросит: P.