Nano Hash - криптовалюты, майнинг, программирование

Справедливый алгоритм для распределения работы по узлам без несправедливости по отношению к производителям

У меня возникла следующая проблема, и я ищу некоторые идеи.

У меня есть N производителей работы и M потребителей. N производителей производят работу и помещают ее в Q очередей сообщений, которые контролируются потребителями.

так что у нас есть

N    ->         -> M       In this example N producers put work in a round robin 
N    ->    Q    -> M       fashion to Q queues which are monitored for new work
N    ->         -> M       in a round robin fashion from M consumers
N    ->    Q    -> M
N    ->         -> M
N    ->    Q    -> M
N    ->         -> M
                -> M
                -> M

Предположим следующий пример:

У N1 есть 100 рабочих элементов для производства N2 есть 1 рабочий элемент для производства N3 есть 1 рабочий элемент для производства

Предположим, что есть Q1 и Q2

N1 отправляет 100 рабочих элементов в Q1 N2 отправляет 1 рабочий элемент в Q2 N3 отправляет 1 рабочий элемент в Q1 (так как это циклический алгоритм)

N3 будет ждать завершения всей работы N1.

Я ищу способ распределить работу между N и M более равномерным и справедливым образом.

Спасибо


  • Кроме того, я не слишком заморачиваюсь по поводу потребительского голода, так как такого никогда не бывает (потому что работы хватает на всех). 22.07.2014
  • Если один производитель поставит в очередь элементы 1, 2 и 3, вы ожидаете, что они будут обработаны в таком порядке? Или их можно обрабатывать в порядке 3, 2, 1? 22.07.2014
  • Их можно обрабатывать в любом порядке. Мне все равно, если это 1, 1, 1, 2, 1, 1, 3, 1 22.07.2014

Ответы:


1

Я думаю, что алгоритм, подобный приведенному ниже, был бы полезен для вас, он делает мельчайшие изменения в вашем алгоритме RR, поэтому вам не нужно много менять:

work(Product product) {
    if (product is small)
        put in queue
    else {
        split product into independent parts
        fork new subtasks to solve each part
        join all subtasks
        compose result from subresults
    }
}

Если я правильно помню, это часть алгоритма кражи работ.

22.07.2014

2

Один из способов сделать это — изменить очереди так, чтобы они были не очередями элементов, а очередями записей производителей, каждая из которых содержит очередь элементов. Таким образом, если у вас есть N производителей, каждая очередь будет иметь не более N записей. Каждая запись содержит список (очередь) заданий от этого производителя.

Затем потребитель удаляет запись производителя из очереди, удаляет следующее задание для этого производителя из записи производителя, а затем снова добавляет производителя в очередь. Затем потребитель переходит к обработке этой работы. Если потребитель удаляет последнее задание из записи производителя, не добавляйте производителя обратно в очередь. Он будет воссоздан в следующий раз, когда производитель поставит задание в очередь.

Некоторое время назад я сделал что-то очень похожее с проектом поискового робота. Это сработало очень хорошо.

22.07.2014

3

По сути, то, что вы описали, - это то, как вы интерпретировали RR для своей проблемы, я бы интерпретировал это по-другому:

каждый производитель будет заполнять одну очередь за другой. Здесь все еще есть небольшая проблема, так как для вашего примера Q1 будет содержать 52 задачи (половина из N1 плюс N2+N3), а Q2 будет содержать только 50 задач, но эту разницу можно считать довольно незначительной.

Однако, если бы все производители производили с одинаковой скоростью, они всегда бомбардировали бы одну и ту же очередь сообщениями, что тоже нехорошо, поэтому давайте объединим ваше и мое решение, изменив очередь, в которую отправляется исходная задача:

N1 начинается с Q1, N2 начинается с Q2 и N3 снова с Q1.

Таким образом, мы получим разделение 51:51.


если вас не волнует порядок заполнения очереди, вы также можете просто выбрать случайным образом. Это удивительно эффективное и равномерно распределенное решение, не требующее практически никакого алгоритма. Однако равное распределение применяется только в том случае, если количество распределяемых задач велико. Кроме того, все задачи должны быть примерно одинакового размера, так как равномерно распределяется только количество задач, а не объем работы, но это также относится к ранее упомянутым адаптациям RR.

22.07.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..