Наличие набора данных, где в каждом ряду должна применяться функция взвешивания в сочетании с каждым другим рядом (перекрестное соединение).Применяется ли функция, зависит от данных в обеих строках, поэтому я не могу просто использовать базу данных.
Следовательно, решение реализовано на python.Для повышения производительности следует применять многопоточность.
Теперь возникает вопрос: какова формула для разделения набора данных на равномерно распределенные итерации, чтобы каждый поток выполнял практически одинаковую работу.
Упрощенная версия кода приведена ниже.
l = 250000 # number of rows
N = 8 # number of threads
for threadid in range(N):
kstart = ### WHAT IS THE FORMULA TO GIVE EACH THREAD THE SAME WORK
### i.e. the starting index of the next thread begins after the last row of the previous thread
klen =
# Start thread here
#threading.Tread(..., (kstart,klen))
def _threaded(kstart, klen):
for k1 in range(kstart, klen):
for k2 in range(k1, l - k1):
# DoSomething(k1, k2)
pass
Пример:
Показанный выше цикл приводит к следующим итерациям:
k1 | k2
0 | 0 to 249999 = 250000 iterations in inner loop
1 | 1 to 249999 = 249999 iterations in inner loop
2 | 2 to 249999 = 249998 iterations in inner loop
...
249999 | 249999 = 1 iteration in inner loop
- Простойверсия kstart может быть: 'l // N * threadid' - это распространяет весь набор в равномерно распределенные группы.
Тема 1: 0 - 31249
Тема 2: 31250- 62499
...
Thread 8: 218750 - 249999
- Теперь мы позволим циклу k1 выполнить kstart до kstart следующей партии.
- Проблема сейчас в том, что для малых k1, k2 приходится много работать.Для большого k1 работа почти равна нулю.
Как лучше нарезать партии для k1, чтобы?
Thread 1: 0 - 10
Thread2: 11 - 100
Тема 3: 101 - 500
Тема 8: 128000 - 250000
(это пример, цифры не верны)