Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / заполнение массива несколькими потоками / 12 сообщений из 12, страница 1 из 1
10.12.2020, 19:40
    #40026555
qlewerok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение массива несколькими потоками
имеется двумерный массив и десятки\сотни потоков его заполняют так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Dim locali As Long
SyncLock MessagesLock
locali = globali'globali - глобальная переменная
Interlocked.Increment(globali)
End SyncLock
mass(locali, 0) = "0"
mass(locali, 1) ="1"
mass(locali, 2) ="2"

это очень медленно. как бы этот массив заполнять сразу строками, не вычисляя номер строки? как list, но чтоб массив и безопасно для всех потоков
...
Рейтинг: 0 / 0
10.12.2020, 19:56
    #40026567
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение массива несколькими потоками
qlewerok
массив заполнять сразу строками
сделай массив массивов, в чем проблема?
...
Рейтинг: 0 / 0
10.12.2020, 19:57
    #40026568
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение массива несколькими потоками
Зачем синхронизировать Interlocked ?
Достаточно так
Код: c#
1.
2.
3.
4.
locali = Interlocked.Increment(globali)
mass(locali, 0) = "0"
mass(locali, 1) ="1"
mass(locali, 2) ="2"



Если надо очень быстро, то каждый поток пишет свой массив и в конце все массивы сливать в один.

PS Это работает если код именно такой как ты написал
...
Рейтинг: 0 / 0
10.12.2020, 20:06
    #40026576
qlewerok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение массива несколькими потоками
Dima T,

объединять массивы разве не дольше, чем сразу писать нормально в массив? Dima TДостаточно такда, действительно
...
Рейтинг: 0 / 0
10.12.2020, 20:08
    #40026580
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение массива несколькими потоками
Shocker.Pro
qlewerok
массив заполнять сразу строками
сделай массив массивов, в чем проблема?

+1
Сначала поток заполняет свой массив и добавляет его ConcurrentQueue<T>
...
Рейтинг: 0 / 0
10.12.2020, 20:11
    #40026582
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение массива несколькими потоками
qlewerok
объединять массивы разве не дольше, чем сразу писать нормально в массив?

Надо проверять. Если ты с разных потоков одновременно пишешь в один массив - скорость записи падает раз в 10+ из-за синхронизации кэшей ядер проца.
...
Рейтинг: 0 / 0
10.12.2020, 20:31
    #40026590
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение массива несколькими потоками
Если не углубляться в технические особенности, то потолок распараллеливания ограничивает Закон Амдала . Там формулы простые, из них понятно что чем меньше синхронизации потоков тем лучше распараллеливается решение задачи. Поэтому обычно быстрее получается когда каждый поток посчитал свое, а в конце все отдали результат потоку, который склеивает все результаты в общую кучу.
...
Рейтинг: 0 / 0
10.12.2020, 20:32
    #40026592
qlewerok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение массива несколькими потоками
Dima T,

если я создаю массив подмассивов и из разных потоков записываю в разные подмассивы, то всё нормально там с ядрами проца? на выходе хорошо бы нормальный обычный массив иметь, т.к. его потом ещё сложно обрабатывать надо весь. в крайнем случае list. или в нём такие же проблемы?
...
Рейтинг: 0 / 0
10.12.2020, 20:38
    #40026598
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение массива несколькими потоками
qlewerok
Dima T,

если я создаю массив подмассивов и из разных потоков записываю в разные подмассивы, то всё нормально там с ядрами проца?

Не все нормально, но лучше чем было. Будет примерно так (VB не знаю, пишу схематично)
Код: c#
1.
2.
3.
4.
5.
local_mass(0) = "0"
local_mass(1) ="1"
local_mass(2) ="2"
locali = Interlocked.Increment(globali)
mass(locali) = local_mass


Количество записей в общую память снижается, следовательно снижается количество перебросов между кэшами ядер. Насколько быстрее станет - надо тестить.
...
Рейтинг: 0 / 0
10.12.2020, 21:29
    #40026609
qlewerok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение массива несколькими потоками
Dima Tmass(locali) = local_massнеотслеживаемая ошибка, когда прописываю эту строчку. объявляю глобально
Код: vbnet
1.
Dim mass As String()()

локально
Код: vbnet
1.
Dim local_mass(8) As String
...
Рейтинг: 0 / 0
14.12.2020, 18:13
    #40027732
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение массива несколькими потоками
Можно попробовать ConcurrentDictionary.
...
Рейтинг: 0 / 0
16.12.2020, 00:00
    #40028166
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение массива несколькими потоками
qlewerok,

почему вы используете именно масив?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / заполнение массива несколькими потоками / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]