Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 1
Регистрация: 25.06.2017
Сообщений: 69

Распределить нагрузку на 6-ядерный CPU

28.12.2018, 12:03. Показов 3083. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые программисты, помогите примером кода.

C#
1
2
3
4
5
6
7
StreamReader reader = new StreamReader(path,Encoding.Default);
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                if (line.Contains(textBox1.Text) == true)
                    searchResult.Add(line);//добавление в список типа List
            }
В таком как есть виде Задача выполняется в едином потоке. Нужно развести её на имеющиеся в наличии ресурсы, то есть полностью задействовать 6-ядерный CPU со всеми его 12 threads. Помогите, плз, примером кода.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.12.2018, 12:03
Ответы с готовыми решениями:

Снять нагрузку с CPU
Есть консольное приложение: public static Dictionary<string, Api> UserList = new Dictionary<string, Api>(); public static void...

Узнать нагрузку CPU/RAM
В общем есть сервер КС, нужно написать программу, которая выводила бы нагрузку на CPU и RAM, запущен ли сервер. В которую сторону мне...

4-8 ядерный CPU для Gigabyte GA-965GM-S2
Здравствуйте. Хочу взять 4-х или 8-и ядерный процессор б.у на Ebay для платы Gigabyte GA-965GM-S2 посоветуйте пожалуйста что мне лучше...

41
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16445 / 11288 / 2892
Регистрация: 21.04.2018
Сообщений: 33,189
Записей в блоге: 2
28.12.2018, 18:02
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Но это абсолютно никак не значит что файл нельзя сконвертировать в формат удобный для дальнейшей обработки в абсолютно другом приложении, не имеющем никакого отношения к тому которое сгенерировало файл.
Но конвертация это тоже операция чтения! Alexandrus2017, это и делает - конвертирует исходный файл в нужные ему данные. И ему надо максимизировать скорость этой конвертации
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну надеюсь создатели стандартной библиотеки шарпа достаточно пряморукие чтобы мувить буфер в данном случае, а не копировать в новый свежесозданный дестанейшин, а старый выбрасывать.
Нет, это не так. Проверено на практике. Посмотрите по ссылке выше. В той теме всё мерялось, проверялось.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.12.2018, 18:11
Элд Хасп, Ага типа выбирая в комбобоксе ключ? Не похоже. Больше похоже на выборку непосредственно для просмотра/редактирования и т.п. Если бы было конвертирование с индексацией оно бы не по ключу выбирало, а разделяло бы записи на поля и строило бы индекс (и сам список возможных ключей как таковой) по значению ключевого поля по ходу пьесы.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Нет, это не так. Проверено на практике. Посмотрите по ссылке выше. В той теме всё мерялось, проверялось.
Дякую боже що я не шарпист. Ну а вообще в таком случае нужно подходящую для работы со строками библиотеку/язык выбирать, а не лечить костыли прикручиванием еще большего количества костылей.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16445 / 11288 / 2892
Регистрация: 21.04.2018
Сообщений: 33,189
Записей в блоге: 2
28.12.2018, 18:30
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Дякую боже що я не шарпист. Ну а вообще в таком случае нужно подходящую для работы со строками библиотеку/язык выбирать, а не лечить костыли прикручиванием еще большего количества костылей.
C# - это язык Net. А в Net string - это НЕИЗМЕНЯЕМЫЙ тип данных. Но насколько помню, это если не во всех, то в большинстве языков так.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ага типа выбирая в комбобоксе ключ? Не похоже. Больше похоже на выборку непосредственно для просмотра/редактирования и т.п. Если бы было конвертирование с индексацией оно бы не по ключу выбирало, а разделяло бы записи на поля и строило бы индекс (и сам список возможных ключей как таковой) по значению ключевого поля по ходу пьесы.
Если такие выборки по ключу из одного и того же файла многочисленны, то Вы правы. Надо файл конвертировать в более удобный формат.
Это вопрос к Alexandrus2017. Пусть уточнит ТЗ, так как это принципиально разные методы, и требуют разного подхода.
Но если даже файл один, а ключ это любой участок строки (используется же метод line.Contains(textBox1.Text)), то БД не даст преимущества перед последовательной побайтовой обработкой файла. И наиболее вероятно, будет уступать в разы по скорости. Единственное где БД даст преимущество, это при серверном расположении файла и обработке файла сразу на сервере.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.12.2018, 19:09
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но если даже файл один, а ключ это любой участок строки
то искать надо не по строкам а по файлу целяком.

Добавлено через 44 секунды
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А в Net string - это НЕИЗМЕНЯЕМЫЙ тип данных
мув буфера это не изменение буфера/содержимого буфера. это изменение владельца.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16445 / 11288 / 2892
Регистрация: 21.04.2018
Сообщений: 33,189
Записей в блоге: 2
28.12.2018, 19:31
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
то искать надо не по строкам а по файлу целяком.
Это понятно, я о другом. Если бы искать ключ надо было бы в определённой части строки, то можно было бы сделать базу и индексировать по этому участку. А в данном случае от индексации толку не будет.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
мув буфера это не изменение буфера/содержимого буфера. это изменение владельца.
Да, для случая с изменяемым типом данных. А для чтения в строку (метод reader.ReadLine()), фактически, буфер не создаётся. Явно буфер создаётся, насколько помню, только для чтения в массив байт.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
29.12.2018, 01:55
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А для чтения в строку (метод reader.ReadLine()), фактически, буфер не создаётся
ну дак если не создается то и мусора нет.
т.е. по большому счету может происходить одно из двух - в 3-ей строке создается буфер и в него копируются символы,а в 6-ой он мувится в список,
либо в 3-ей строке запоминается пара итераторов указывающие на буфер потока, а в 6-ой создается буфер и в него копирую символы, которые находятся между этой парой итераторов.
Надеюсь у создателей стандартной библиотеки шарпа хватило прямоты ручек сделать один из двух этих вариантов.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16445 / 11288 / 2892
Регистрация: 21.04.2018
Сообщений: 33,189
Записей в блоге: 2
29.12.2018, 02:03
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
ну дак если не создается то и мусора нет.
т.е. по большому счету может происходить одно из двух - в 3-ей строке создается буфер и в него копируются символы,а в 6-ой он мувится в список,
Не знаю может мы разную терминологию применяем, поэтому понять не можем друг друга.

Система при считывании файла создаёт буфер по любому. Но я не об этом буфере говорю.
При чтении в массив байт создаётся ещё и управляемый из C# буфер. Это неизменная область памяти в которую поочерёдно записываются блоки информации из файла.
При чтении файла в строку. Каждый раз для новой строки выделяется новый участок памяти - это уже замедляет. Но большая проблема - это то, что старые строки отправляются в мусор и там потихоньку аккумулируются. И периодически память от этого мусора очищается. И эти процессы значительно замедляют приложение.
И это не просто теория. Я Вам уже писал. В указанной выше теме, это всё проверялось и оптимизировалось. Удалось довести загрузку диска до почти 100% используя именно чтение файла в массив байт.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
29.12.2018, 02:20
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но большая проблема - это то, что старые строки отправляются в мусор и там потихоньку аккумулируются.
НУ дак их можно отправлять не в мусор а в накапливаемый список. т.е. строка это по факту буфер для символов и указатель на него. при отправке из line в serachResult не надо создавать еще один буфер и копировать туда символы из буфера line.
Достаточно просто перенести указатель - т.е. взять его из line добавить в searchResult а в line указатель обнулить.
ну типа сделать добавление аналогично вот такому
C++
1
2
3
4
5
6
vector<string> searchResults;
string line;
while(condition1){ 
   cin  >> line;
   if (condition2)  searchResults.emplace_back(std::move(line));
}
и никакого мусора. а тот что оставляется в виде буферов строк которые пропустили убирабелен или реюзабелен сразу же при чтении новой строки.
0
Эксперт .NET
 Аватар для Usaga
14821 / 9605 / 1369
Регистрация: 21.01.2016
Сообщений: 36,158
29.12.2018, 06:30

Не по теме:

Fulcrum_013, чегой-то вы в этой ветке забыли?)



Alexandrus2017, в данном случае, если я правильно понял ТЗ, вам строки нужны только после того, как вы убедитесь, что они подпадают под критерии поиска.

Я рекомендую завести небольшой пул буферов (возможно завёрнутых в своё простое представление строки) в которые и читать данные из файла. И поиск подстроки в этом буфере совершать своими силами. И преобразование этого буфера в строку (для сохранения в результатах поиска) производить только после подтверждения наличия в нём подстроки искомой. Memory pressure будет нулевой.

Fulcrum_013, ваш фрагмент кода подразумевает создание новой строки на каждой итерации цикла, так что ничем это не лучше того, что в коде на C# выше показано ТС-ом.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16445 / 11288 / 2892
Регистрация: 21.04.2018
Сообщений: 33,189
Записей в блоге: 2
29.12.2018, 10:13
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
НУ дак их можно отправлять не в мусор а в накапливаемый список. т.е. строка это по факту буфер для символов и указатель на него. при отправке из line в serachResult не надо создавать еще один буфер и копировать туда символы из буфера line.
Достаточно просто перенести указатель - т.е. взять его из line добавить в searchResult а в line указатель обнулить.
ну типа сделать добавление аналогично вот такому
То что Вы показываете, может быть возможно на С++ - я не знаю. Но на C# - строки НЕИЗМЕНЯЕМЫ! Невозможно из строки сделать буфер! Невозможно переписать в строку новое значение! Любое изменение строки и выделение нового участка памяти под новую строку!
Зачем все эти извращения, выдумки, если есть возможность сделать нормальный байтовый буфер, который поддерживается из "коробки"?
Тот приём который Вы показали, возможно сделать на C# как буфер типа MemoryStream. Но это будут всё равно дополнительные накладные расходы по сравнению с байтовым буфером.
Попробуйте сами поэкспериментируйте. Но с БОЛЬШИМ файлом - заведомо большим чем доступное ОЗУ.

Добавлено через 3 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
Я рекомендую завести небольшой пул буферов (возможно завёрнутых в своё простое представление строки) в которые и читать данные из файла. И поиск подстроки в этом буфере совершать своими силами. И преобразование этого буфера в строку (для сохранения в результатах поиска) производить только после подтверждения наличия в нём подстроки искомой. Memory pressure будет нулевой.
Да, такое решение будет самым быстрым. Уже проверено.
Для данного случая - последовательной проверки не связанных друг с другом строк хватает пула из байтов размером с самую длинную строку.
1
Эксперт .NET
 Аватар для Usaga
14821 / 9605 / 1369
Регистрация: 21.01.2016
Сообщений: 36,158
29.12.2018, 10:17
Элд Хасп, я понял его задумку. Имеется в виду, что раз выделять строку, то можно её внутренний буфер перетащить в другое место. Т.е. аллокацию один раз произвести. Но это в С++. И мне не совсем понятно, где будет располагаться внутренний буфер строки. Если там же, где и сам объект строки (в стёке), то совет - говно полное.

С другой стороны, нам строка нужна только при выполнении условия, а Fulcrum_013 предалагает строки аллоцировать каждый раз, что тоже фигня.

Буфер, выделенный заранее, - наше всё.

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для данного случая - последовательной проверки не связанных друг с другом строк хватает пула из байтов размером с самую длинную строку.
Да тут даже разные варианты можно нафантазировать: один большущий буфер, пул буферов разного размера, ReadOnlySequence<T> и прочее.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16445 / 11288 / 2892
Регистрация: 21.04.2018
Сообщений: 33,189
Записей в блоге: 2
29.12.2018, 10:23
Цитата Сообщение от Usaga Посмотреть сообщение
Но это в С++
То есть в С++ - строки изменяемы? Пытаюсь понять как они тогда организованы - не соображу. Будет время - загляну в документацию по С++.
0
Эксперт .NET
 Аватар для Usaga
14821 / 9605 / 1369
Регистрация: 21.01.2016
Сообщений: 36,158
29.12.2018, 10:27
Цитата Сообщение от Элд Хасп Посмотреть сообщение
То есть в С++ - строки изменяемы?
Да. Технически, в C# тоже, но при использовании unsafe.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16445 / 11288 / 2892
Регистрация: 21.04.2018
Сообщений: 33,189
Записей в блоге: 2
29.12.2018, 10:33
Цитата Сообщение от Usaga Посмотреть сообщение
Да. Технически, в C# тоже, но при использовании unsafe.
Разве?
Насколько помню, в C# создаётся пул строк-констант и при создании новой строки проверяется наличие такого же значения в пуле. Если нет, то до дополняется пул, если есть то присваивается ссылка на уже имеющуюся.
Или я с чем-то путаю?
0
Эксперт .NET
 Аватар для Usaga
14821 / 9605 / 1369
Регистрация: 21.01.2016
Сообщений: 36,158
29.12.2018, 10:59
Элд Хасп, проверьте сами:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
 
namespace Experiments
{
    class Program
    {
        static unsafe void Main()
        {
            var name = "Usaga";
 
            Console.WriteLine(name);
 
            fixed (char* c = name)
            {
                *c = 'O';
            }
 
            Console.WriteLine(name); // Osaga
 
            Console.ReadKey();
        }
    }
}
Только выставите галочку "Allow Unsafe Code" в настройках проекта.
1
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
29.12.2018, 11:20
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Насколько помню, в C# создаётся пул строк-констант и при создании новой строки проверяется наличие такого же значения в пуле.
Всё верно.
C#
1
2
3
4
5
6
7
8
9
10
11
12
    var name = "Usaga";
 
    Console.WriteLine(name);
 
    fixed (char* c = name)
    {
        *c = 'O';
    }
 
    Console.WriteLine(name); // Osaga
    name = "Usaga";
    Console.WriteLine(name); // Osaga
2
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
29.12.2018, 11:29
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Насколько помню, в C# создаётся пул строк-констант и при создании новой строки проверяется наличие такого же значения в пуле. Если нет, то до дополняется пул, если есть то присваивается ссылка на уже имеющуюся.
Да, но только для строк-констант. Если вы например загружаете строку из файла, то строка в пул не попадает (это было бы слишком долго). Однако ее можно туда насильственно отправить через метод Intern. Кстати интернатизация строк - хороший способ экономить память, если у вас загружается много одинаковых строк из внешнего источника.

Пример:
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
    using System;
 
    namespace Experiments
    {
        class Program
        {
            static unsafe void Main()
            {
                var name = "Usaga"; //in pool
                var name2 = "Usaga"; //in pool
                var name3 = name.Substring(0, 3) + name.Substring(3, 2); //is NOT in pool, because it is not constant
                var name4 = string.Intern(name3); // send to pool and get refernce to pooled string
 
                fixed (char* c = name)
                {
                    *c = 'O';
                }
 
                Console.WriteLine(name); // Osaga
                Console.WriteLine(name2); // Osaga
                Console.WriteLine(name3); // Usaga
                Console.WriteLine(name4); // Osaga
 
                Console.ReadKey();
            }
        }
    }
2
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
29.12.2018, 11:54
Рихтер:
По умолчанию при загрузке сборки CLR интернирует все литеральные строки,
описанные в метаданных сборки. Выяснилось, что это отрицательно сказывается на
производительности из-за необходимости дополнительного поиска в хеш-таблицах,
поэтому Microsoft теперь позволяет отключить эту «функцию». Если сборка отмечена
атрибутом System.Runtime.CompilerServices.Compilat ionRelaxations
Attribute, определяющим значение флага System.Runtime.CompilerServices.
CompilationRelaxations.NoStringInterning , то в соответствии со спецификацией
ECMA среда CLR может отказаться от интернирования строк, определенных в метаданных
сборки. Обратите внимание, что в целях повышения производительности
работы приложения компилятор C# всегда при компиляции сборки определяет
этот атрибут/флаг.

Даже если в сборке определен этот атрибут/флаг, CLR может предпочесть
интернировать строки, но на это не стоит рассчитывать. Никогда не стоит писать
код, рассчитанный на интернирование строк, если только вы сами в своем коде
явно не вызываете метод Intern типа String.
2
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
29.12.2018, 15:40
Цитата Сообщение от Usaga Посмотреть сообщение
ваш фрагмент кода подразумевает создание новой строки на каждой итерации цикла, так что ничем это не лучше того, что в коде на C# выше показано ТС-ом.
Абсолютно нет. Он подразумевает пересоздание буфера только в том случае когда размера буфера от прошлой итерации не хватает/буфер был забран в список. При этом возврат буфера при пересоздании происходит сразу.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16445 / 11288 / 2892
Регистрация: 21.04.2018
Сообщений: 33,189
Записей в блоге: 2
29.12.2018, 16:12
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Абсолютно нет. Он подразумевает пересоздание буфера только в том случае когда размера буфера от прошлой итерации не хватает/буфер был забран в список. При этом возврат буфера при пересоздании происходит сразу.
Вы проверили реальную скорость с разными способами чтения? Или это чисто теория?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.12.2018, 16:12

2-4 ядерный CPU для MSI MS-6580
Товарищ попросил подобрать более быстрый процессор для материнской платы MICRO-STAR INC. MSI MS-6580 Сейчас стоит камень Intel Pentium 4...

Возможно ли распределить нагрузку между 2 компьютерами
Есть пк и ноутбук. На пк не хватает мощностей железа, так вот возможно ли разделить нагрузку между пк и ноутбуком?

Как распределить нагрузку между разными серверами
Нужно написать проект для быстрого масштабирования. Для этого я думаю о возможности запросов с сайта и получении данных через ajax...

Распределить нагрузку веб-сервера с помощью Squid и Apache
Я пытаюсь создать систему балансировки нагрузки для веб-сервера с помощью Squid и Apache. как реализовать конфигурации для системы...

Рассуждение: как распределить нагрузку на сервер и сеть с наименьшими потерями?
Есть сервер с СУБД Firebird. Есть клиенты, которые обращаются к БД. Их будет где-то &gt; 150. Есть страница, где идет выбор значений....


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru