Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/38: Рейтинг темы: голосов - 38, средняя оценка - 4.58
7 / 7 / 1
Регистрация: 02.03.2011
Сообщений: 310

Можно ли использовать несколько потоков для обработки файла

23.06.2012, 19:45. Показов 7718. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
У меня такая вот ситуация, есть код который читает данные из txt файлы и выполняется. Это занимает очень много времени и грузит систему всего на 12%. Есть вариант, разделить все на 8 частей и одновременно запустить 8 программ.
Прочитал про многопоточность и подумал вместо того чтоб 8 раз код запускать сделать 8 потоков, но так как в программировании я не профи. Есть пара вопросов.
1. Загрузит ли это систему на все 100%?
2. Если я обьявляю все переменные глобально, до создания потоков, при расчетах получается одна переменная существует в 8 потоках, я немного не понимаю, в каждом потоке она будет иметь свое значение? Значения путаться не будут?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.06.2012, 19:45
Ответы с готовыми решениями:

Как можно парсить ссылки в несколько потоков?
Например, есть текстовый файл с миллионом ссылок. Пользователь указывает определенное число потоков. Допустим, пользователь указал 13...

Можно ли использовать команду TASKILL для потоков?
Друзья, коллеги и знатоки, нужен ваш совет. Ситуация такая. Есть процесс. Пусть он называется sacrifice.exe. После обновления...

Программа для обработки аудио/видео, где можно одновременно выделить несколько фрагментов
В аудиофайле выделяю 5/10/15 фрагментов, дальше нужно вырезать всё кроме выделенного или скопировать выделенное, создать новую...

7
29 / 31 / 2
Регистрация: 14.04.2012
Сообщений: 152
23.06.2012, 20:21
выложи код пожалуйста
0
 Аватар для Монфрид
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,246
23.06.2012, 20:52
вам синхронизировать нужно потоки, чтобы они не путались там с переменными вашими. Систему это на 100% загрузить не сможет никак)
0
7 / 7 / 1
Регистрация: 02.03.2011
Сообщений: 310
23.06.2012, 22:01  [ТС]
Код очень большой, тысячи строк, много вычислений. Нет смысла выкладывать.
Во время работы синхронизировать уже нечего будет. Между потоками ничего общего быть не может. В каждом потоке свои данные, и читать они txt файлы поразному будут.
Я просто думал, что можно в самом начале создать потоки, а далее чтоб этот код выполнялся в нескольких разных потоках не зависимо друг от друга.
Просто не знаю идти в этом направлении или нет, по идее можно просто параллельно 8 раз код запустить (пробовал, работает отлично, проц на 98% работает, память на 50%, скорость не падает), но хочется чтоб все было по человечески, да и исправления тогда удобней будет вносить.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.06.2012, 23:32
Цитата Сообщение от xxxspeed Посмотреть сообщение
Нет смысла выкладывать.
Тогда, по большому счету, и обсуждать что-то нет смысла - будут лишь догадки и предположения (а предположение, как известно, - мать всех факапов).

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

Цитата Сообщение от xxxspeed Посмотреть сообщение
Если я обьявляю все переменные глобально, до создания потоков, при расчетах получается одна переменная существует в 8 потоках
Это немного противоречит сказанному.

Цитата Сообщение от xxxspeed Посмотреть сообщение
Я просто думал, что можно в самом начале создать потоки, а далее чтоб этот код выполнялся в нескольких разных потоках не зависимо друг от друга.
Конечно можно.
Единственная проблема, которая может возникнуть при работе с потоками - это общие ресурсы. То есть одни и те же объекты, которые используются и (главное!) изменяются в разных потоках. Если имеется такой сценарий, то необходима синхронизация. Если такой ситуации нет, то переживать вам не о чем - потоки между собой пересекаться не будут, потому любые излишние нагрузки на проц и память - это уже вопрос эффективности конкретного алгоритма.
0
7 / 7 / 1
Регистрация: 02.03.2011
Сообщений: 310
24.06.2012, 00:57  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Цитата Сообщение от xxxspeed Посмотреть сообщение
Нет смысла выкладывать.
Тогда, по большому счету, и обсуждать что-то нет смысла - будут лишь догадки и предположения (а предположение, как известно, - мать всех факапов).
Я думаю если я выложу 8674 строчки кода, никто не будет в них копаться

Добавлено через 4 минуты
Цитата Сообщение от xxxspeed Посмотреть сообщение
1. Загрузит ли это систему на все 100%?
2. Если я обьявляю все переменные глобально, до создания потоков, при расчетах получается одна переменная существует в 8 потоках, я немного не понимаю, в каждом потоке она будет иметь свое значение? Значения путаться не будут?
Я в здесь не просил исправить мне код, я лишь хотел получить ответ на эти 2 вопроса.

Добавлено через 1 минуту
Если нужен код, я подумаю тогда как сократить его до минимума и задам вопрос, как разделить его на потоки.
Спасибо.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
24.06.2012, 01:11
тогда по двум вопросам еще раз.
Цитата Сообщение от xxxspeed Посмотреть сообщение
1. Загрузит ли это систему на все 100%?
у тебя цель - загрузить систему на 100%? это можно сделать и в одном потоке. если вопрос в том, может ли многопоточность увеличить производительность выполнения задачи - да, сможет, хотя это зависит от характера задачи. при определенных обстоятельствах может и понизить.
Цитата Сообщение от xxxspeed Посмотреть сообщение
...получается одна переменная существует в 8 потоках, я немного не понимаю, в каждом потоке она будет иметь свое значение? Значения путаться не будут?
переменная не "существует в потоке". ты путаешь поток с чем-то другим.
приведу тебе пример потока. ты пришел в супермаркт со списком, взял тележку и начинаешь выполнять алгоритм:

0. выбрать первое незачеркнутое из списка и зачеркнуть.
1. пойти найти на полках. если нашел - положить в тележку.
2. гоуту 0.

это - однопоточный режим, поток - это ты, единолично выполняющий алгоритм и безраздельно пользующийся ресурсами (список, карандаш, тележка).

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

-1. взять карандаш (синхронизационный объект). если занят - дождаться пока освободится.
0. выбрать первое незачеркнутое из списка и зачеркнуть.
0.5. освободить карандаш.
1. пойти найти на полках. если нашел - положить в тележку.
2. гоуту -1.

потоки - это ты и твои кореша в данном примере. но, заметь, ничто не "принадлежит потокам": ни карандаш, ни список, ни тележка. так и с твоей глобальной переменной.
0
7 / 7 / 1
Регистрация: 02.03.2011
Сообщений: 310
24.06.2012, 12:40  [ТС]
Цитата Сообщение от novi4ok Посмотреть сообщение
приведу тебе пример потока. ты пришел в супермаркт со списком, взял тележку и начинаешь выполнять алгоритм:
0. выбрать первое незачеркнутое из списка и зачеркнуть.
1. пойти найти на полках. если нашел - положить в тележку.
2. гоуту 0.

а теперь - многопоточность. список прикреплен к тележке, и вас, пришедших за покупками - несколько, и вы друг с другом не общаетесь. ты пришел, прочитал "водка", пошел искать. твой кореш подошел одновременно с тобой, тоже прочитал "водка" и тоже вычеркнул и пошел искать... требуется синхронизация. например, имеется один карандаш, и только имея в руке карандаш, можно получить доступ к списку. тогда алгоритм будет следующий:
-1. взять карандаш (синхронизационный объект). если занят - дождаться пока освободится.
0. выбрать первое незачеркнутое из списка и зачеркнуть.
0.5. освободить карандаш.
1. пойти найти на полках. если нашел - положить в тележку.
2. гоуту -1.
Спасибо, хороший пример.
Если сравнивать с супермаркетом, то есть типа как общие txt файлы - супермаркет (типа как IKEA, один такой длинный извилистый коридор, где чтоб дойти до кассы надо пройти весь магазин по порядку), а потоки люди, которые все выполняют один и тот же код. Но у каждого свой кошелек, тележка, список и т.п. Но тележка, кошелек, список и т.п. (а в моем случае еще сотня всяких вещей) это глобальные переменные, только в каждом конкретном случае они заполняются по разному, в каждой тележке лежит разный товар, в каждом кошельке разные суммы денег... И время которое затратит каждый человек в магазине разное. Общее только то, что они все одновремеено в супермаркет вошли. Далее между ними ничего общего нет, кто то быстро все пройдет, кто то медленно. В конце просто каждый пройдет через кассу и пробъет чек (сохранит свой результат в своем txt файле).

Цитата Сообщение от novi4ok Посмотреть сообщение
у тебя цель - загрузить систему на 100%? это можно сделать и в одном потоке. если вопрос в том, может ли многопоточность увеличить производительность выполнения задачи - да, сможет, хотя это зависит от характера задачи. при определенных обстоятельствах может и понизить.
Так вот моя цель увеличить производительность, а соответственно и загрузку компа.

Так вот, сейчас у меня получается, что в одном супермаркете одновременно ходит один человек, или же второй вариант, я строю несколько супермаркетов и в каждом ходит один человек. Конкретно в моем случае строительство еще 7 супермаркетов увеличивает производительность в 8 раз и соответственно загрузку компа до 100%, при этом скорость не снижается.

Но я склоняюсь к мнению, что это не правильное решение проблемы. И есть другой выход. Но так как я не профи в этом, я спрашиваю ВАС, тех кто во всем этом спец, как мне поступить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.06.2012, 12:40
Помогаю со студенческими работами здесь

Создание потоков для обработки файлов
Помогите создать поток С потоками раньше дел не имел. Есть код на кнопке, обрабатывает файлы последовательно. Это долго. Хочется разбить...

Можно ли использовать несколько ELSE IF?
if (условие) { ... } else if (условие) { ... } else if (условие) { ... } else { ... } visual studio 2010 (windows...

запись и выгрузка строк из файла без потерь в несколько потоков
Здравствуйте. В общем есть такой скрипт который будет собирать строки текста и записывать в файл.тхт, методом post передавая строки на...

Как можно использовать несколько форм?
Как можно использовать нескольких форм(из них Form1 главный) (Form1,Form2,Form3,...)? (на C#) (Win App)

Сервер с использованием пула потоков для параллельной обработки запросов клиентов
Разработать сервер с использованием пула потоков для параллельной обработки запросов клиентов. К серверу подключается много клиентов, все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru