|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
||||||
Как правильно поступить для потокобезопасности17.02.2024, 07:19. Показов 3916. Ответов 62
Метки нет (Все метки)
Здравствуйте,
Есть код, обрабатывающий побайтно файл, заранее загруженный в byte[]. Потоки организуются средствами C# через Parallel.ForEach вот таким образом:
if выполнится, в другом потоке max изменится и когда будет исполняться Exchange, то оно по сути испортит данные? Логичнее ли сделать через lock весь if?Вопрос 2 - как правильно покидать Parallel.ForEach внутри кода, если там не получается использовать break? Я сейчас просто делаю метку к концу и прыгаю туда goto.
0
|
||||||
| 17.02.2024, 07:19 | |
|
Ответы с готовыми решениями:
62
Как правильно поступить? Как правильно поступить как правильно поступить? |
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|||||||||||||
| 26.02.2024, 09:23 [ТС] | |||||||||||||
|
100х900000 ~ 90M 1000х900000 ~ 900M Мне сложно объяснить конкретно, так как пример не соответствует моему коду и самой задаче. Но не переживайте, ваше решение (сама идея) это то, что уже у меня было реализовано, так что вы всё написали правильно, просто реализация на C# у вас медленная, я же правильно понимаю что там используется LINQ (или как там правильно называются SQL-подобные вставки)? А он очень медленный и прожорливый. Я его не умею готовить, это понятно, но когда что-то читаю на SO или здесь и потом смотрю на результат, то всегда всё печально, но несомненно короткий код и быстрая реализация. Если требуется то переписываю так как мне нужно. Добавлено через 10 минут
0
|
|||||||||||||
|
14786 / 9560 / 1366
Регистрация: 21.01.2016
Сообщений: 36,048
|
||
| 26.02.2024, 09:54 | ||
|
0
|
||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
||||||||
| 26.02.2024, 10:43 [ТС] | ||||||||
0
|
||||||||
|
14786 / 9560 / 1366
Регистрация: 21.01.2016
Сообщений: 36,048
|
|
| 26.02.2024, 10:45 | |
|
0
|
|
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|
| 26.02.2024, 10:51 [ТС] | |
|
0
|
|
|
14786 / 9560 / 1366
Регистрация: 21.01.2016
Сообщений: 36,048
|
|
| 26.02.2024, 10:54 | |
|
belalugoci, не умеют те, кто жалуется на прожорливость LINQ'а. Кто умеет пользоваться - вопросов к технологии не имеют.
0
|
|
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|
| 26.02.2024, 11:04 [ТС] | |
|
0
|
|
|
Модератор
|
||
| 26.02.2024, 11:11 | ||
|
1) Код, в принципе, не имеет смысла переводить в многопоточный. Типичный пример: простая одноразовая обработка потока (файла). 2) Код имеет выигрыш в многопоточном варианте, но при определённых условиях. Условно: для файла в 1Гб выигрыш есть, для 100Мб - нет. Или при запуске на 5 потоках выигрыш есть, а при запуске на 50 - нет. 3) Многопоточность даёт выигрыш, но способов её реализации много. И в данной реализации или не верно выбран способ реализации, или не верно создана реализация выбранного способа. К сожалению, ответить на эти вопросы сможете только вы сами, ввиду явной недостаточности предоставленной вам публичной информации.
0
|
||
|
|
||
| 26.02.2024, 11:42 | ||
|
1
|
||
|
14786 / 9560 / 1366
Регистрация: 21.01.2016
Сообщений: 36,048
|
|
| 26.02.2024, 11:52 | |
|
0
|
|
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
||||||
| 26.02.2024, 12:07 [ТС] | ||||||
|
Как использовать ThreadLocal никто не написал, всё что прочитал в MSDN и разных примерах никак не поможет. Добавлено через 42 секунды Добавлено через 3 минуты
0
|
||||||
|
|
||
| 26.02.2024, 12:21 | ||
|
Вы более точно указали задачу: найти самую длинную строку. Я дал пример. Вы попробовали повторить -- получили негативный результат. Я указал что возможно причина в том что разбивали на 500. Это нужно было воспринять как "окей, попробую сделать 4(!) таски, которые будут процесить свои блоки", а не искать среди постов остальных пользователей что-то, что будет противоречить моему высказыванию. p.s. не проверял, но подозреваю что для 1кк строки разбиение на 4 потока тоже не даст сильного прироста. Современным CPU перелопатить 1млн элементов довольно плевое дело.
0
|
||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|||||||||
| 26.02.2024, 13:11 [ТС] | |||||||||
|
Конкретно ваша реализация плохая по двум параметрам из трёх. Третий мне не важен, я не работаю в команде и меня не интересует скорость разработки, а значит полезность ответа нулевая. Ок, спешл фо ю сделаю вариант на 225К на блок. А у себя "отпущу" размер блоков в свободное плавание (сейчас они у меня ограничены 16 байтами), там блоки могут варьироваться от 524000 до 536000000. Добавлено через 8 минут ForEach работает медленно из-за lock, через Task моя реализация работает быстро, но у меня там нет LINQ, реализация Wolfdp и ОЗУ кушает больше и тормознее. Из чего можно уже сейчас сказать, что выигрыш есть и моя реализация работает. Если тут подскажут еще какой-то вариант - попробую его. Самое быстрое решение конечно с Interlocked, но к несчастью из всего материала что я прочитал я так и не понял как можно его применить для моего кода. А при небезопасном использовании и хороших показаниях в скорости идёт 4 ошибки на 1 млн, что уже считаю недопустимым.
0
|
|||||||||
|
Модератор
|
|||
| 26.02.2024, 13:42 | |||
|
Например, последовательное суммирование выполняется на уровне процессорных регистров. Но если нужна синхронизация суммы с другими потоками, то почти на 100% она будет происходить через память верхнего уровня + к этому ещё время на ожидания подтверждения локирования. Это в десятки, если не сотни раз медленнее чем регистровое суммирование. В вашей задаче, как я понял, вам нужен только конечный результат. Промежуточные не нужны. Верно? В таком случае каждая задача может скидывать результат end - start в коллекцию, а по завершению всех задач - выбрать максимум из этой коллекции.
0
|
|||
|
|
||||||
| 26.02.2024, 14:50 | ||||||
|
Не по теме: Мне вот интересно, почему люди которые постоянно спорят, вместо попыток более внимательно прочитать/проресечить, постоянно отписываются простынями? Причем, блин, отвечают не весь кусок, а на каждое отдельное предложение. Добавлено через 33 минуты Чекнул для 50_000_000 слов длиной от 10 до 30 -- однопоточный отрабатывает за 00:00:00.0000162.
P.S. хз чего ТС вцепился за Linq, по факту в моем изначальном примере молотил StringBuilder для каждого слова, хотя можно было чекать тупо индексы, а потом делать финальный Substring. Скорее всего у ТСа однопоточный вариант по индексам и работал, сравнивал с многопоточным StringBuilder.... Ну да ладно, как сам писал -- не первый, и не последний.
0
|
||||||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|||||||||
| 26.02.2024, 14:50 [ТС] | |||||||||
|
если вы намекаете на то, что файл грузится 100 мс, а код выполняется 10 мс, то да, такой эффект есть, но когда вы обрабатываете например 400 Гб файлов и вместо 30 минут ждёте результат 20, то лично для меня это хороший результат. И одного внимательно прочтения недостаточно, еще нужно уметь понять то, что читаешь. А я многое совсем не понимаю.
0
|
|||||||||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
||
| 26.02.2024, 14:59 | ||
|
Ну т.е. при следующем сценарии: 1. Запустить процесс. 2. Загрузить 20ГБ в память с SSD. 3. Обработать. 4. Полностью завершить процесс. 5. Снова запустить тот же процесс. 6. Загрузить те же 20ГБ в память с SSD. В пункте 6 время загрузки данных из файла в память может быть и как в п.2, и в десятки-сотни раз быстрее. И если это не учитывать при исследовании скорости алгоритмов, обрабатывающих большие объёмы данных (т.е. не производить предварительную полную загрузку файла/частей в память или не исключать это время из отчётов), то результаты могут сильно разниться даже между двумя запусками одного и того же алгоритма в полностью идентичных условиях.
0
|
||
| 26.02.2024, 14:59 | |
|
Подскажите как правильно поступить как правильно поступить с COOKIE как правильно поступить с hover Отображение левого меню, как правильно поступить? Как правильно нужно поступить в текущей ситуации? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|