Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: многопоточность, сколькопоточность? Добавлено: 05.03.11 00:19  

Автор вопроса:  Winand | Web-сайт: winandfx.narod.ru
Предположим, что я хочу считать информацию из 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-сайт: winandfx.narod.ru
 Профиль | | #2
Добавлено: 05.03.11 08:01
несоизмеримо быстрее, только теги вытащить. Я думаю максимум 100мс на 100 файлов, надо померить. А открытие 100 файлов я намерил аж 1900мс, но это, наверное, от излишней распараллельности.

Ответить

Номер ответа: 3
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #3 Добавлено: 05.03.11 09:57
Winand пишет:
 Я думаю максимум 100мс на 100 файлов,

Врядли,аимп медленнее делает. Делай действительно, поочереди.
А количество потоков на чтение файлов должно быть равно числу дисков учавствующих в списке файлов. Причем как уже сказано выше, один поток на один диск

Ответить

Номер ответа: 4
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #4
Добавлено: 05.03.11 10:24
Причем именно дисков, т.е. физических дисков, а не логических. Не говоря уже о таких штуках, как SSD, RAID0 и др. - они на параллельный доступ несколько по другому реагируют. В особенности, первый.

Ответить

Номер ответа: 5
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #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.

Выделить несколько гигабайт можно так
  1.     int x = 0;
  2.     List<byte[]> arrays = new List<byte[]>();
  3.  
  4.     for (int i = 0; i < 400; i++)
  5.     {
  6.         arrays.Add(new byte[1024 * 1024 * 10]);
  7.     }
  8.  
  9.     foreach (byte[] bytes in arrays)
  10.         foreach (byte b in bytes)
  11.             x += b;


Можно подправить чтоб выделялось меньше, если на компьютере меньше памяти. Чтоб определить сколько надо выделять, нужно в диспетчере задач посмотреть сколько памяти свободно. Если выделить меньше, не весь кеш будет вытеснен. Если больше, то начнется своппинг.

Считать файл есть несколько способов. Я бы советовал через FileStream, чтоб данные не оставались в памяти. Достаточно считать сотню мегабайт.

Ответить

Номер ответа: 10
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #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-сайт: winandfx.narod.ru
 Профиль | | #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-сайт: winandfx.narod.ru
 Профиль | | #14
Добавлено: 07.03.11 00:09
Artyom
>Чтоб определить сколько надо выделять, нужно в диспетчере задач посмотреть сколько памяти свободно.
Что же кеш хранится в свободной памяти? с чего тогда она свободной называется?

Ответить

Номер ответа: 15
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #15 Добавлено: 07.03.11 01:17
Может я не совсем верно термин выбрал, не свободная а доступная. Нет русской версии винды чтоб проверить.

Доступная потому что любое приложение ее может занять, и она сразу поступает в его распоряжение. Ее не нужно перед этим сбрасывать в файл подкачки, так как она и так хранится на диске. В отличие от той памяти, которая занята другими приложенями, которую нужно будет сначала сбросить.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам