Страница: 1 | 2 |
Вопрос: многопоточность, сколькопоточность?
Добавлено: 05.03.11 00:19
Автор вопроса: Winand | Web-сайт:
Предположим, что я хочу считать информацию из 100 mp3 файлов. Открытие файла происходит в отдельном потоке. Стоит ли открывать всё сразу или, например, открыть 5 потоков, а остальные добавить в очередь.
Суть вопроса - сколько разумно открывать потоков одновременно?
Ответы
Всего ответов: 19
Номер ответа: 1
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #1
Добавлено: 05.03.11 00:55
Если читаешь с жесткого диска - читай по одному, ибо он медленный, и любит последовательность. Если ты считываешь два файла параллельно, то головка (в случае большойжирной фрагментации) будет мотаться туда-сюда, и скорость падает не в 2, а в 10 раз. Ну это так, условно. Короче жесткий диск такие вещи не особо любит. Если у тебя SSD - можно уже немножко косо смотреть в сторону многопоточности. Если ты вообще обрабатываешь данные, и не обращаешься к жесткому диску, то идеальный вариант - столько потоков, сколько ядер в системе. Можно еще на 1 больше, т.е. n+1.
В твоем случае я бы запилил так: файлы считываются последовательно в одном потоке и добавляются в очередь. В это время из этой очереди параллельно читают столько потоков, сколько есть ядер в системе. Таким образом, мы распараллеливаем работу жесткого диска и всех ядер системы. Но это для больших файлов и сложных вычислений, по идее mp3 крошечные, и тут такая вася слишком жирно, как говорится, из расты по воробьям. Пили лучше 1 поток для считывания и 1 для обработки. Считал 1 файл, считываешь 2 файл и обрабатываешь 1, считываешь 3 файл и обрабатваешь 2 и т.д. ибо обработка, как я понял из твоей задачи, несоизмеримо быстрее, чем считываение файла с жесткого диска. Или соизмеримо?
Номер ответа: 2
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #2
Добавлено: 05.03.11 08:01
несоизмеримо быстрее, только теги вытащить. Я думаю максимум 100мс на 100 файлов, надо померить. А открытие 100 файлов я намерил аж 1900мс, но это, наверное, от излишней распараллельности.
Номер ответа: 3
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #3
Добавлено: 05.03.11 09:57
Я думаю максимум 100мс на 100 файлов,
Врядли,аимп медленнее делает. Делай действительно, поочереди.
А количество потоков на чтение файлов должно быть равно числу дисков учавствующих в списке файлов. Причем как уже сказано выше, один поток на один диск
Номер ответа: 4
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #4
Добавлено: 05.03.11 10:24
Причем именно дисков, т.е. физических дисков, а не логических. Не говоря уже о таких штуках, как SSD, RAID0 и др. - они на параллельный доступ несколько по другому реагируют. В особенности, первый.
Номер ответа: 5
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #5
Добавлено: 05.03.11 21:02
кстати 1900мс - это на WD 500GB*2 в RAID0. Тестить производительность сильно мешает дисковый кеш, который вручную сбросить, насколько я знаю, нельзя
Номер ответа: 6
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #6
Добавлено: 05.03.11 21:14
нуда, быстрый способ перезагрузка
Номер ответа: 7
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #7
Добавлено: 05.03.11 23:35
Сбросить системный кеш элементарно - выделить несколько ГБ памяти, вытеснив его из оперативной памяти.
Если речь идет о кеше собственно жесткого диска, то достаточно считать большой файл. На диске сейчас больше 64 мб кеша не бывает.
Надеюсь примеры кода не нужны.
Номер ответа: 8
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #8
Добавлено: 06.03.11 16:17
Зря надеешься, примеры кода нужны на VB6, взялся за гуж не говори, что не дюж
Номер ответа: 9
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #9
Добавлено: 06.03.11 16:31
Я ни за что не брался, тем более за VB6.
Выделить несколько гигабайт можно так
Можно подправить чтоб выделялось меньше, если на компьютере меньше памяти. Чтоб определить сколько надо выделять, нужно в диспетчере задач посмотреть сколько памяти свободно. Если выделить меньше, не весь кеш будет вытеснен. Если больше, то начнется своппинг.
Считать файл есть несколько способов. Я бы советовал через FileStream, чтоб данные не оставались в памяти. Достаточно считать сотню мегабайт.
Номер ответа: 10
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #10
Добавлено: 06.03.11 20:56
Smith, ну почему же. к примеру потоки в любом случае на Си
Artyom, я так понимаю, что это кеш ОС, а не жесткого диска. Тот самый, который заставляет рекурсивный поиск работать быстрее при нескольких запусках.
Номер ответа: 11
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #11
Добавлено: 06.03.11 20:58
Ну, наверное, не надо быть особым задротом, чтобы написать код для чтения какого либо файла размером в 64 мб?..
Номер ответа: 12
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #12
Добавлено: 06.03.11 21:41
AgentFire, а вот и надо! Когда учишься таким вещам, забываешь что-нибудь другое. И всё заканчивается раскрашиванием фигурок из Властелина колец (это из IT Crowd)
На самом деле считывание ~70 метрового файла ничего не меняет. Так что кеш жд тут не при чем.
И да, открытие файлов последовательно занимает примерно вдвое больше времени, чем запуск всех потоков для сотни файлов сразу. Но это рейд0.
Номер ответа: 13
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #13
Добавлено: 06.03.11 22:56
Winand, я показал как сбросить кеш жесткого диска и кеш ОС. Кеш первого сбрасывается чтением 64+ мб, кеш второго - вытеснением его (либо другими файлами, либо каким-то приложением).
Кеш ОС может достигать нескольких гигабайт (вобщем он может занимать всю свободную память компьютера), поэтому чтение 70 метров ничего не даст в этом случае.
Номер ответа: 14
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #14
Добавлено: 07.03.11 00:09
Artyom
>Чтоб определить сколько надо выделять, нужно в диспетчере задач посмотреть сколько памяти свободно.
Что же кеш хранится в свободной памяти? с чего тогда она свободной называется?
Номер ответа: 15
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #15
Добавлено: 07.03.11 01:17
Может я не совсем верно термин выбрал, не свободная а доступная. Нет русской версии винды чтоб проверить.
Доступная потому что любое приложение ее может занять, и она сразу поступает в его распоряжение. Ее не нужно перед этим сбрасывать в файл подкачки, так как она и так хранится на диске. В отличие от той памяти, которая занята другими приложенями, которую нужно будет сначала сбросить.