|
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
|
Параллельное чтение нескольких файлов19.05.2021, 10:19. Показов 4462. Ответов 15
Всем привет, подобный вопрос я как-то раз уже задавал, но так и не понял некоторые аспекты. Необходимо реализовать параллельное чтения большого кол-ва файлов, в каждом файле есть какая-то определенная информация, которую процессор возможно обработает быстрее чем само чтение и парсинг из этого файла. Для решения этой задачи я решил, что должна быть потокобезопасная очередь, какое-то кол-во потоков (например половина доступных аппаратной конкурентностью потоков) читает файлы и пишут в эту очередь, и потоки, которые берут из очереди (порядок не важен) данные и работают с ними. Но тут возникает несколько нюансов:
1) Если нет возможности параллельного чтения с жесткого диска, то те потоки, которые должны параллельно в очередь писать, будут работать по принципу тонкого горлышка, когда только один поток может производить основную работу (то есть прочитать из файла), конечно он может например после этого начать парсить текст, создать какой-нибудь объект и закинуть его в очередь (+- выйгрыш). Какое решение у такого рода проблемы может быть? Стоит ли тогда вообще сделать всего один читающий файлы и записывающий что-то в очередь поток? 2) А может стоит всё сделать очевиднее, пускай каждый поток и читает из файла, и парсит, и выполняет операции. Не будет никакой потокобезопасной очереди и никаких особых ограничений? Такое решение выглядит хоть и некрасиво, но проше. Только непонятно, будет ли оно оптимальным? 3) К вопросу из 1 нюанса, а можно ли с помощью C++ определить, есть ли возможность параллельного чтения с диска и получив ответ от системы, как-то подстраиваться под это. (например выполнять как я придумал выше в случае если можно, а в противном делать, используя 1 поток на чтение). Хотелось бы разбираться в best practice когда нужна параллельная обработка и множество данных лежит на диске, понимать что и как нужно использовать. Заранее благодарю!
0
|
|
| 19.05.2021, 10:19 | |
|
Ответы с готовыми решениями:
15
Параллельное чтение из txt файлов
Чтение нескольких файлов |
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 19.05.2021, 10:40 | |
|
0
|
|
|
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
|
| 19.05.2021, 12:50 [ТС] | |
|
nmcf, ну да, я же и не спорю, я просто не могу понять что тут параллелить. Много файлов с какими-то командами, быстрое исполнение этих команд. При чем чтение с диска в момент именно копирования с памяти диска в память оперативки - однопоточное, поэтому конечно непонятно какой выигрыш я получу если будет много потоков читателей (мб конечно если они прочитают файл и пойдут его обрабатывать (распарсят, выполнят операцию и снова пойдут читать какой-нибудь файл), то выигрыш и будет)
Добавлено через 1 час 59 минут Ну неужели нет каких-то очевидных правил при такой проблеме с файловой системой? Или какого-нибудь способа узнать можно ли параллельно читать с диска? :c
0
|
|
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 19.05.2021, 13:38 | |
|
Чем тебе вариант 2 не нравится?
0
|
|
|
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
|
| 19.05.2021, 14:12 [ТС] | |
|
nmcf, ну потому что я не уверен, что эти потоки будут оптимальнее работать чем в 1-м случае. Потому что возникает вопрос, если все потоки будут пытаться дергать один диск, будет ли этот диск занят для одного потока пока тот не закончит читать файл или же из-за процессорных прерываний он будет менять потоки, при этом запоминая где текущий поток остановился и на какой строке, тем самым диск будет "крутиться" туда сюда в зависимости от того какой файл открывает текущий поток, который в данный квант времени выбрал шкедулер!? Ну как по мне, в таком случае чтение будет медленнее и затратнее, но параллелить нужно (таково задание), однако мне неочевидно как это распараллелить эффективно, наверное стоит попробовать всё и посмотреть бенчмарки, сравнить.
Возможно в C++ есть способ определить RAID массив тут или чтение из какого-то облака (то есть то, что обеспечит параллельность физическую) или же это диск с возможностью лишь однопоточного чтения. Тогда вероятнее способ когда один поток читает, а остальные слушают - лучше, а если же всё-таки RAID-массив, то уже 2) или 1) пункты. Хотя 1-й мне кажется самым эталонным и поэтому хочется его попробовать в первую очередь протестировать.
0
|
|
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 19.05.2021, 17:35 | |
|
Там будет всякое кеширование ниже твоей программы.
Если так интересно, сделай пробный вариант и посмотри.
0
|
|
|
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
|
| 23.05.2021, 04:52 [ТС] | |
|
Написал я наконец ту структуру, которую задумывал изначально, чтобы 4 потока читали из файлов и клали в очередь команды, а другие 4 потока брали команды из очереди и выполняли их. И протестировал этот способ со способом, когда есть лишь 1 читатель и когда каждый поток и читает и пишет. Результаты ниже (на 1000 файлов в директории). Почему CPU время для некоторых параллельных бенчей он вывел как 0 я хз.
Compute1 - 4 читают из файла 4 выполняют операции Compute2 - 1 читает из файла 7 выполняют операции Compute3 - 8 и читают из файла и выполняют операции Вообще, думаю, 2 вариант может быть отличным, если операции реально долгие. Что-то такое я использовал когда писал приложение по поиску слов, в которых есть введенное пользователем слово. (брал по несколько десятков слов в ОЗУ под каждый из потоков и они уже искали там подходящие слова, вроде вышло быстро) Думаю стоит потестить только с чтением из файла, и мб завтра этим займусь.
0
|
|
|
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
|
||||
| 23.05.2021, 06:49 | ||||
|
Добавлено через 3 минуты по таймингу ведь лучше всех получился а чем вам понравился? этот
0
|
||||
|
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
||||
| 23.05.2021, 12:09 [ТС] | ||||
|
JeyCi,
0
|
||||
|
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
|
| 23.05.2021, 14:22 [ТС] | |
|
Я ошибся в написании решения, когда 8 потоков и читает и пишет. У меня каждый из потоков в итоге обрабатывал все файлы, а вот уже с исправленным решением вывод по времени, и это всё выглядит, конечно, разрушающе по сравнению с моей теорией (писал потокобезопасную очередь с достаточно сложной реализацией напрасно :c ).
0
|
|
|
Комп_Оратор)
|
||
| 23.05.2021, 16:16 | ||
|
HamsterGamer, я подозреваю, что задача достаточно сильно завязана на железе. Если не рассматривать вопросы кеширования на самом диске, то механический диск и ssd ( не вникая в различия в пределах каждой категории) тоже отличаются. Механический диск пишет и читает цилиндрами. Это значит что блок головок двигается как единое целое (моноблок). Контроллер распараллеливает линейную запись по головкам (конвейерам, которые буферизуются). Это значит, что доступ к записи (и чтению - читается тоже трехмерная структура секторов расположенных на разных сторонах дисков вращающихся на одном шпинделе) не распараллеливается. То есть, физически доступ к одному диску (не дисковому пространству а устройству как таковому) последователен. Это говорит о том, что вы возможно правы в том что:
В этом случае, действительно, асинхронность когда один читает, - другие считают, может дать прирост общей скорости. Но тут важно ещё учесть, что диск может использоваться другими программами (OS не последняя, может свопить на него если так сконфигурировано и есть потребность). С этим вряд ли что-то можно сделать, но в принципе я бы попробовал симитировать сложную вычислительную задачу, чтобы увидеть профит.
1
|
||
|
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
|
||
| 23.05.2021, 17:39 | ||
|
сколько ядер на HDD и SSD?
Добавлено через 6 минут а вот выполнялись ли некоторые потоки параллельно (на 2х и более ядрах) - не знаю вашу конфигурацию... и если задачи, действительно, быстрые (т.е. файлы не большие и их обработка не длительная)... то на переключениях контекстов вы могли больше потерять, чем выиграть...
0
|
||
|
40 / 29 / 11
Регистрация: 21.06.2019
Сообщений: 201
|
||||
| 23.05.2021, 18:31 [ТС] | ||||
|
IGPIGP,
1) Случай, когда файлов много - нужно использовать простейший способ, просто поделить эти файлы между потоками и пусть они сами уже их читают, обрабатывают и так далее. Потому что в моём представлении это неявная критическая секция, ограненная примитивом синхронизации под названием невозможность параллельного чтения с диска. Пускай она пугает меня тем, что чтение не произойдет полностью для одного потока, а потом сразу для следующего и так далее, как это было бы с операцией под мьютексом, но думаю ОС лучше знать кому и как позволять крутить жесткий диск. 2) Случай, когда файл один с большим кол-вом данных. Тут я думаю, что реализация с потокобезопасной очередью и одним читающим потоком (и остальными вычисляющими) - лучшая, потому что в случае если потоков читающих из одного файла будет много, то диск улетит в космос от такой раскрутки вдоль файла + такая реализация проще и понятнее. 3) Случай, когда в директории нужно обработать много файлов с большими данными. Ну тут я думаю нужно использовать 2 случай и просто последовательно складывать части файлов в очередь, представляя всё как один большой сплошной кусок данных. (при этом в пунктах 2 и 3 важно, что вычисляющие потоки не просто складывают 2+2, а например парсят и обрабатывают информацию, иначе появляется вариант всего с 2 потоками, где один читает из очереди, а другой в нее пишет) JeyCi,
0
|
||||
|
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
|
||||||
| 23.05.2021, 20:10 | ||||||
|
есть IO-bound операции -- это как раз чтение ваших файлов... ускориться, вероятно, можно - Parallel I/O – Why, How, and Where to? - опять же всё сводится к файловой системе и потокам, или многопоточным (типа MPI) библиотекам... а это опять же Linux и его концепция "всё есть файл" и его многопоточная (серверная) природа, рассчитанная на обслуживание многих клиентов в параллеле даже с одного файла (пространства на диске) - но при условии, что доступ к файлу идёт от разных процессов или по сетевой технологии (когда инфо с node'ов стекается в корень)... в общем там по линку всё описано... и про файловую систему:
в общем, бегло просмотрев статью, склоняюсь к тому, что можно пробовать (что уже давно попробовали и без нас) ускорять движение данных по сети... но ускорить считывание со своего родного жёсткого диска - маловероятно (куда уж быстрее, если он и так рядом, под боком у монитора, оперативки и проца) - только если ускорить аппаратно вращение диска (т.е. взяв более быстрый HDD)... c SSD немного др. история
не работала с SSD, не видела ваш код, а, главное, не знаю, на каких библиотеках вы параллелите и не знаю, какие из имеющихся либ максимально продуктивно организуют параллельный IO... всё что заметила - то, что для обработки научных данных используют parallel IO - что и понятно, для повторности опытов - можно и параллельный IO организовать на входе... Добавлено через 7 минут спасибо за ваши тесты, если как-нибудь наковыряете ещё какие-нибудь субординарные результаты в придачу к этим, выкладывайте
1
|
||||||
|
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
|
|||||||||||||||||
| 25.05.2021, 07:55 | |||||||||||||||||
|
касательно асинхронности: (ДЛЯ IO-BOUND)
вот ради интереса приложу свой старый код на Python - асинхронного чтения отсюда - выкладываю полностью с обращением к папке - Кликните здесь для просмотра всего текста
выполняет в з потока - просто считывает и print'ует (в это место можно добавить свои вычисления) - мои тестовые 453 файла считывает за милисекунды, действительно быстро, файлы небольшие
в 3 асинхр. очереди - выполнил за 0.61ms в 3 асинхр. очереди без вывода (просто чтение) - тоже за 0.59ms ... синхронный вариант не проверяла для сравнения (не было времени)... просто у Python свои огранчения в виде GIL (по сути "глобальный мьютекс" для всех потоков, т.к. интерпретатор не может параллельно обрабатывать все потоки - поэтому threads - так себе, а MultiProcessing вроде снимает эти блокировки c GIL)... но следую обычно этому псевдо-коду с habr
приведу пару цитат про асинхронность -
=== свои нюансы асинхронности в C#.NET
Кликните здесь для просмотра всего текста
ru_stackoverflow_com_/questions/503721/%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D0%BF%D0% BE%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B5-vs-%D0%B0%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0% BE%D0%BD%D0%BD%D0%BE%D0%B5-%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0% B5-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0% BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D 0%BD%D0%B8%D0%B5-%D0%BD%D0%B0-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0% BA%D0%B5
- и опять всё упёрлось в сервер... ========================== касательно многопоточности: (ДЛЯ CPU-BOUND) встречались советы "выравнивать нагрузку", т.к., например, при использовании пула потоков
1
|
|||||||||||||||||
| 25.05.2021, 07:55 | |
|
Помогаю со студенческими работами здесь
16
Чтение из нескольких файлов Чтение нескольких файлов. Работа с файлами в С++ Параллельное чтение книг Параллельное чтение, обработка и запись в файл OpenMP Параллельное программирование. Когда несколько потоков зависят от одного и один от нескольких Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|