0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 68
1
.NET 4.x

Какие потоки лучше при обработки небольшого объёма информации, но при большом количестве потоков

12.02.2014, 19:27. Показов 2528. Ответов 25
Метки нет (Все метки)

Собственно заинтересовали следующие вопросы:
  1. Какой из потоков работает быстрее?
  2. Какой из потоков стартует быстрее?
  3. Какие потоки лучше при обработки небольшого объёма информации, но при большом количестве потоков ?
  4. Какие потоки лучше при обработки большого объёма информации, но при небольшом количестве потоков ?
  5. Какой поток лучше для работы асинхронно?
  6. Какой поток Вы считаете лучшим и почему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2014, 19:27
Ответы с готовыми решениями:

Ошибки на большом количестве потоков с сокетами
У меня проблема следующего характера, есть многопоточное приложение которое парсит по спискам...

Зависание Excel-я при попытке копирования небольшого объёма информации
Добрый день! Не могу разобраться с проблемой. Есть файл (во вложении), при попытке копирования из...

Json не сработал при большом количестве информации
отдельно ссылки проверял, обе работают, когда пытаюс ьдекодировать в json - первая работает, а...

Не ляжет ли БД при большом количестве запросов
Увидел такой коммент на одном из ресурсов Добрый день, Андрей. Я пытался на сайте реализовать...

25
Эксперт .NET
5474 / 4244 / 1211
Регистрация: 12.10.2013
Сообщений: 12,248
Записей в блоге: 2
12.02.2014, 19:33 2
1. Зависит от приоритета. С одинаковым приоритетом - примерно одинаково.
2. Тот, который запущен раньше.
3, 4. Все зависит от ситуации - какие цели стоят перед программой, вряд ли можно вот так точно сказать...
5. Асинхронный.
6. Тот, который лучше всего выполняет поставленную задачу.
1
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 68
12.02.2014, 19:37  [ТС] 3
Цитата Сообщение от insite2012 Посмотреть сообщение
5. Асинхронный.
А именно?
ThreadPool?
0
Эксперт .NET
5474 / 4244 / 1211
Регистрация: 12.10.2013
Сообщений: 12,248
Записей в блоге: 2
12.02.2014, 19:42 4
Это пул потоков. Именно асинхронный, то есть работающий асинхронно. Запускаете асинхронно поток, и все, он работает... Поток сам по себе - это поток, и все, а какой - зависит от того, как он был запущен.
0
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
12.02.2014, 19:42 5
юзайте ThreadPool или TPL и будет вам счастье, и забудьте про ручное создание потоков
1
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 68
12.02.2014, 19:48  [ТС] 6
Цитата Сообщение от агерон Посмотреть сообщение
юзайте ThreadPool или TPL и будет вам счастье, и забудьте про ручное создание потоков
Могли бы Вы пожалуйста привести пример использования TPL?
0
Эксперт .NET
5474 / 4244 / 1211
Регистрация: 12.10.2013
Сообщений: 12,248
Записей в блоге: 2
12.02.2014, 19:48 7
А к чему ThreadPool, если, к примеру, нужен всего один (два) потока? ИМХО, в ручном режиме проще запустить...
0
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
12.02.2014, 20:09 8
insite2012, ну... нельзя же так, а управлять распределением нагрузки в многоядерной системе тоже сами будете?

Добавлено через 2 минуты
пока по вопросам параллелизма могу предложить статью Работа с потоками в C# из RSDN, позже, если не буду загружен, покажу пару примеров
2
Эксперт .NET
5474 / 4244 / 1211
Регистрация: 12.10.2013
Сообщений: 12,248
Записей в блоге: 2
12.02.2014, 20:14 9
Спасибо, занятная статья, почитаю на досуге.
0
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 68
12.02.2014, 20:20  [ТС] 10
Допустим есть след. задача:
имеется файл с большим количеством строк(например 9млрд.) и нужно проверить каждую строку файла с опред. текстом, если совпадает, то сохранить в другой текстовый файл.

Я использовал обычный Thread.
Но вот просто я подумал, что может быть при использовании потока ThreadPool или Task работа потока будет быстрее
0
Эксперт .NET
5474 / 4244 / 1211
Регистрация: 12.10.2013
Сообщений: 12,248
Записей в блоге: 2
12.02.2014, 20:30 11
Если я правильно понял статью (быстро пролистал и кинул в закладки), то Вам поможет PLINQ (параллельный LINQ).
0
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
12.02.2014, 20:46 12
Едва ли можно придумать что-то лучшее чем асинхронная обработка файла в отдельном потоке. Распараллеливать здесь нечего т.к. детерминированной коллекции строк как таковой нет (если вы конечно не собираетесь загружать все 9ккк строк в память).
0
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
12.02.2014, 23:58 13
9 млрд строк? вы ничего не путаете? если это так то у вас будут безумные объемы данных
если принять что средняя строка = 100 символам то потребление памяти можно рассчитать по формуле
память = размер символа в байтах*количество символов*количество строк что равно 2*100*9*10^9 = 18*10^11 что примерно равно 1,63 терабайта при данной задаче вам нужно смотреть в сторону оптимизации хранения данных, к примеру данные хранить не в текстовых файлах а в базе данных и использовать для доступа к данным правильно построенные индексы
0
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 68
13.02.2014, 02:06  [ТС] 14
агерон, мм.....ну как бы суть использования потоков... чтобы каким либо образом асинхронно получать доступ... давайте возьмём к примеру 9 млн. строк.
Просто хочу с Вами посоветоваться какие потоки лучше использовать.
0
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
13.02.2014, 02:10 15
Цитата Сообщение от FerroDS Посмотреть сообщение
какие потоки лучше использовать.
Любые, точнее одни, они только для разных систем различаются. Все потоки одинаковые, есть различные обертки но сути потоков они не меняют
1
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 68
13.02.2014, 02:17  [ТС] 16
Цитата Сообщение от Yukikaze Посмотреть сообщение
Любые, точнее одни, они только для разных систем различаются. Все потоки одинаковые, есть различные обертки но сути потоков они не меняют
Что бы Вы посоветовали для асинхронного сравнения строк в потоках?
0
burning1ife
1460 / 1282 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
13.02.2014, 06:34 17
Один из самых быстрых алгоритмов сравнения на мой взгляд, хотя может кто предложит и быстрее
C#
1
2
3
4
5
6
7
if(strA.Length == strB.Length)
{
   if(string.Compare(strA,strB,true) == 0)
   {
       //одинаковые
   }
}
Цитата Сообщение от insite2012 Посмотреть сообщение
Если я правильно понял статью (быстро пролистал и кинул в закладки), то Вам поможет PLINQ (параллельный LINQ).
По поводу PLINQ:

из http://msdn.microsoft.com/en-u... .110).aspx
я понял, что его есть смысл использовать в случаях:
1. если операция над каждым элементом довольно продолжительная.
2. большое кол-во элементов в коллекции.
3. чем больше ядер, тем лучше.
0
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
13.02.2014, 09:54 18
Провел бенчмарк, выполнял поиск с использованием LINQ, PLINQ и чистых потоков, в файле на 100млн строк.
В последнем тесте мог накосячить, лучше перепроверить, но первые 2 дают вполне очевидный результат.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
static void Main(string[] args)
{
    Stopwatch sw = new Stopwatch();
    sw.Start();
    var index = LazyRead("large.txt").FirstOrDefault(s => s.Contains("99999999"));
    sw.Stop();
    Console.WriteLine("LINQ: {0}ms, value = {1}", sw.ElapsedMilliseconds, index);
 
    sw = new Stopwatch();
    sw.Start();
    var parallelIndex = LazyRead("large.txt").AsParallel().FirstOrDefault(s => s.Contains("99999999"));
    sw.Stop();
    Console.WriteLine("Parallel LINQ: {0}ms, value = {1}", sw.ElapsedMilliseconds, parallelIndex);
 
    object _lock = new object();
    bool complete = false;
    var enumerator = LazyRead("large.txt").GetEnumerator();
    sw = new Stopwatch();
    sw.Start();
    for (int i = 0; i < Environment.ProcessorCount; i++)
    {
        int threadIndex = i;
        new Thread(o =>
        {
            Monitor.Enter(_lock);
            while (enumerator.MoveNext() && !complete)
            {
                string current = enumerator.Current;
                Monitor.Exit(_lock);
 
                if (current.Contains("99999999"))
                {
                    complete = true;
                    Console.WriteLine("Threads: {0}ms, value = {1}", sw.ElapsedMilliseconds, current);
 
                    Monitor.Enter(_lock);
                    break;
                }
                Monitor.Enter(_lock);
            }
            Monitor.Exit(_lock);
            Console.WriteLine("Worker {0} complete", threadIndex);
        }).Start();
    }
 
    Console.ReadKey(true);
}
 
private static IEnumerable<string> LazyRead(string file)
{
    using (FileStream fs = new FileStream(file, FileMode.Open))
    using (StreamReader sr = new StreamReader(fs))
    {
        while (!sr.EndOfStream)
        {
            yield return sr.ReadLine();
        }
    }
}
Результаты
Какие потоки лучше при обработки небольшого объёма информации, но при большом количестве потоков
2
burning1ife
1460 / 1282 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
13.02.2014, 11:06 19
мне кажется, если бы вместо операции
C#
1
s => s.Contains("99999999")
была более продолжительная, то выиграл бы PLINQ.

А сколько у вас ядер?
0
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 68
13.02.2014, 18:08  [ТС] 20
Yukikaze, спасибо за данный тест.
т.е. из теста следует, что лучше всего использовать LINQ...

Никогда ещё не использовал LINQ.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.02.2014, 18:08
Помогаю со студенческими работами здесь

Unrecognized token при большом количестве совпадений
Здравствуйте, спасибо Вам всем большое за неоднократную помощь! Хочу предупредить сразу, что я...

Утечка памяти при большом количестве сообщений
Есть окно сообщения.При новом сообщения создается новое окно(анимировано),старое...

Вращение 3д графика при большом количестве выводимых данных
Здравствуйте. При работе в Wolfram Mathematica 9.0.1 меня посетила следующая проблема. Мне...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru