Мне нужно создать оптимальный список таблиц базы данных, чтобы их последующая параллельная обработка сводила к минимуму потребление памяти и общее время выполнения.
Обратите внимание, что потребление памяти и время выполнения коррелируют с размером таблицы.
Когда я сортирую их по убыванию по размеру, вначале у меня возникают проблемы с памятью, поскольку все рабочие потоки пытаются загрузить в память самые большие таблицы. Когда обработка больших таблиц начинается слишком поздно, у меня заканчивается длительное время выполнения, поскольку другие работники уже закончили с небольшими таблицами.
Что я делаю сегодня, так это то, что я сначала сортирую их по размеру, а затем перемешиваю их следующим образом:
- начиная с 1 добавить каждую 25-ю таблицу
- , затем начиная с 2 добавить каждую 25-ю таблицу
- ...
- наконец, начиная с 25 берут каждый 25-й стол
Таким образом, я начинаю с самых больших и N / 25 постепенно меньших столов, затем со второй самой большой таблицы и N / 25 других постепенно меньших столов. Конечно, я рассматриваю случай, когда общее количество таблиц не кратно 25.
Этот алгоритм работает в большинстве случаев, но не всегда. Иногда есть много маленьких столов и несколько больших - или наоборот. Особенно размер пакета 25 выбирается искусственно, и я считаю, что есть какой-то лучший способ.
Когда я визуализирую распределение размеров отсортированных таблиц в диаграмме, то обычно это выглядит как кривая безразличия с таблицами на x и размер по оси у. Перемешивание выше преобразовывает это в уменьшающуюся кривую пилообразного Но, тем не менее, это выглядит как кривая, если мы соединяем ее максимальные пики.
То, что я ищу, - это сгладить эту кривую на этих пиках как можно больше, потому что я считаю, что это может быть оптимальным результатом для минимизации потребление памяти и общее время выполнения. Однако мне не хватает алгоритма и математического обоснования для него.
Любые предложения, как решить эту проблему?