Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/14: Рейтинг темы: голосов - 14, средняя оценка - 4.79
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169

Перегрузка памяти, приложение лагает при заполнение HeshSet

04.12.2020, 19:07. Показов 3071. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
У меня возникла проблема, а это жуткие лаги приложения.
Расписываю что оно делает:

Приложение создает рандомные слова из букв, букв у меня 26, длина слов например 6, и это целых 308915776 возможных комбинаций. После сгенерированного слова я его добавляю в HeshSet.

Вроде бы все хорошо и очень быстро, но программа начинает жутко лагать при 40.000.000 строк.
Наверное из за того что моя оперативная память маленькая, да и для других людей естественно это будет не удобно.
Какие есть решения для этой проблемы?
Записывать все уже созданный текстовой файл? А как там проверку делать на наличие дубликатов?

Вот код c объяснениями:

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
private void buttonGen_Click(object sender, EventArgs e)//Запуск метода "StartTask"
        {
            path = TextBoxPath.Text;
            UpdateValueTimer.Enabled = true;
            listGenPass.Clear();
            Task task = new Task(() => StartTaskGenPass());
            task.Start();
        }
 
 public void StartTaskGenPass() //Запуск метода в 10 потоков
        {
            NumberLeignt = Convert.ToInt32(textBoxCharacters.Text);
            NumberPass = Math.Pow(CharacterSet.Length, NumberLeignt);
 
            labelChhet.Invoke((MethodInvoker)delegate { labelChhet.Text = NumberPass.ToString(); }); //RESULT
 
            _tokenSource = new CancellationTokenSource();
            CancellationToken token = _tokenSource.Token;
 
            for (int i = 1; i <= Convert.ToInt32(textBoxNumberTask.Text); i++) //Запускаем потоки
            {
                try{
                    Thread task = new Thread(() => GenRandPassword(token, NumberPass, NumberLeignt));
                    task.Start();
                } catch(OperationCanceledException) { }
            }
        }
 
public void GenRandPassword(CancellationToken token, double numGen, int numLeight) //Метод для создание рандомнного слова
         {
            lock (locker)
            {
                Random random = new Random();
 
                char[] passChars = new char[numLeight];
                for (int i = 1; i <= numGen; i++) //Количество слов
                {
                    if (listGenPass.Count == numGen) //Длина строки
                    {
                        _tokenSource.Cancel();
                        token.ThrowIfCancellationRequested();
                    }
                    for(int j = 0; j < numLeight; j++)
                        passChars[j] = CharacterSet[random.Next(CharacterSet.Length)];
                    listGen.Add(passChars); //Добавление сгенерированного слова
                }
            }
        }
Сразу скажу, была изначально проблема с дубликатами, теперь же проблема с слишком много слов.
Я много раз видел и интересовался программами которые принимают очень много строк, например просто удалениее дубликатов, либо чего то генерирования. Но у меня другая проблема, лагает слишком сильно программа наверно из за недостатка оперативной памяти. Каким способом можно это решить? Помогите пожалуйста!

Ожидаю от вас помощи! Спасибо за внимания.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.12.2020, 19:07
Ответы с готовыми решениями:

Почему при запуске любого приложение ЦП перегружается и все лагает
Добрый вечер! Я уже во 2 раз столкнулся с такой проблемой, как сильное &quot;лагание&quot; игр и т. д. Впервый раз на это я не обратил внимания...

Ноутбук лагает с установленной второй планкой памяти
Имеется ноутбук Asus в нем оперативка 4гб впаянная в мат плату и стоит ещё планка на 8гб 1600мгц Вобщем эта самая планка на 8гб ведёт...

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

19
 Аватар для jester
352 / 247 / 76
Регистрация: 18.03.2016
Сообщений: 979
04.12.2020, 20:16
QmlwZ, нужно больше оперативной памяти.
0
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
04.12.2020, 20:40  [ТС]
jester, а если например моей программой пользуется другой человек?
0
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
05.12.2020, 15:07  [ТС]
Я так понимаю решение этой проблемы нет?
0
Эксперт .NET
 Аватар для Rius
13163 / 7722 / 1679
Регистрация: 25.05.2015
Сообщений: 23,524
Записей в блоге: 14
05.12.2020, 16:12
Цитата Сообщение от QmlwZ Посмотреть сообщение
Записывать все уже созданный текстовой файл? А как там проверку делать на наличие дубликатов?
В файл.
Сделайте перебор без рандома и дубликатов не будет.
Проверьте работу без потоков. Возможно, от них потери больше, чем пользы.
0
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
06.12.2020, 15:41  [ТС]
Rius, здравствуйте.
Спасибо за ответ!
Вы имеете в виду генерировать слова/пароли вот так:

aaa
aab
aac
aad
...


Ну тогда как это совмещать с другими потоками?
Цитата Сообщение от Rius Посмотреть сообщение
Проверьте работу без потоков. Возможно, от них потери больше, чем пользы.
Да, это я заметил, ставлю 1 поток, у меня с такой же скоростью генерируются слова, но почему то они генерируются не все.
Когда я ставлю больше потоков то у меня уже генерируются все варианты слов.
0
Эксперт .NET
 Аватар для Rius
13163 / 7722 / 1679
Регистрация: 25.05.2015
Сообщений: 23,524
Записей в блоге: 14
06.12.2020, 15:45
Цитата Сообщение от QmlwZ Посмотреть сообщение
Вы имеете в виду генерировать слова/пароли вот так:
Да.

Цитата Сообщение от QmlwZ Посмотреть сообщение
Программа будет медленная.
Цитата Сообщение от QmlwZ Посмотреть сообщение
ставлю 1 поток, у меня с такой же скоростью генерируются слова
Что?!

Цитата Сообщение от QmlwZ Посмотреть сообщение
но почему то они генерируются не все.
Или ошибка в коде, или вы от метода с рандомом ожидаете чего-то совсем не того.
Цитата Сообщение от QmlwZ Посмотреть сообщение
Ну тогда как это совмещать с другими потоками?
Совместить возможно. Но лучше просто не используйте потоки.
1
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
06.12.2020, 15:53  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Что?!
Я запускал метод в 10 потоков, метод генерировал рандомное слово, я хотел сделать это быстрее и поставил 10 потоков.
Например возможность сгенерировать 456976 слов, а вот с 1 потоком генерировались где то 380000 слов, с такой же скоростью что и 10 потоков. А вот когда я ставлю 10 потоков то все 456976 слов у меня были сгенерированы.

Цитата Сообщение от Rius Посмотреть сообщение
Совместить возможно. Но лучше просто не используйте потоки.
Почему? Я просто поставил себе задачу что бы сделать хоть какой нибудь генератор быстрым и без лагов, но пока все дела идут плохи.
0
Эксперт .NET
 Аватар для Rius
13163 / 7722 / 1679
Регистрация: 25.05.2015
Сообщений: 23,524
Записей в блоге: 14
06.12.2020, 15:56
Цитата Сообщение от QmlwZ Посмотреть сообщение
Я запускал метод в 10 потоков, метод генерировал рандомное слово, я хотел сделать это быстрее и поставил 10 потоков.
Например возможность сгенерировать 456976 слов, а вот с 1 потоком генерировались где то 380000 слов, с такой же скоростью что и 10 потоков. А вот когда я ставлю 10 потоков то все 456976 слов у меня были сгенерированы.
Ничего не понятно. Но, вроде бы, большой выгоды от применения потоков не видно?

Цитата Сообщение от QmlwZ Посмотреть сообщение
Почему? Я просто поставил себе задачу что бы сделать хоть какой нибудь генератор быстрым и без лагов, но пока все дела идут плохи.
А зачем вам эти слова? Выгрузить в файл? использовать в памяти? Все сразу или кучей?
1
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
06.12.2020, 16:10  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Ничего не понятно. Но, вроде бы, большой выгоды от применения потоков не видно?
Ну у меня генерировались все возможные варианты слов. Генерировал я их с помощи метода который запускался в 10 потоков. Но когда я запускал этот метод через 1 поток, то уже генерировались не все слова. Я не знаю почему.

Ну и как я сказал, что скорость вообще не меняеться. 1 поток может сгенерировать 1.000.000 слов за 1-2 секунды, только вот не все варианты слов сгенерируются. 10 потоков тоже генерировали 1.000.000 слов за 1-2 секунды только все возможные варианты слов.

Добавлял сгенерированное слово в HeshSet, а как я понял в HeshSet не добавляются дубликаты.

Цитата Сообщение от Rius Посмотреть сообщение
использовать в памяти?
Не понимаю.

Слова я создаю так что бы просто научиться генерировать рандомные слова, и много и быстро, так как я видел раньше программы которые как раз работают с большими объемами строк. Ну как я начал делать, то и возникли проблемы.

Потоки не работают, дубликаты есть, да и программа начинает лагать.
0
Эксперт .NET
 Аватар для Rius
13163 / 7722 / 1679
Регистрация: 25.05.2015
Сообщений: 23,524
Записей в блоге: 14
06.12.2020, 16:28
С рандомом все варианты за фиксированное время не собрать.
Если нужны все варианты, то рандом не нужен. Потому что итог простого перебора будет тем же - всеми возможными вариантами, да ещё и за предсказуемое время.
HashSet не хранит дубликаты. А они вам разве нужны?

Добавлено через 55 секунд
Цитата Сообщение от QmlwZ Посмотреть сообщение
Не понимаю.
Как вы собираетесь использовать массив слов?
1
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
06.12.2020, 16:33  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
HashSet не хранит дубликаты. А они вам разве нужны?
Да, это я понял.

Цитата Сообщение от Rius Посмотреть сообщение
Как вы собираетесь использовать массив слов?
Я не как не хочу его использовать, просто записать куда то слова, либо в массив либо как я уже понимаю в текстовой файл.

Когда я записывал сгенерированные слова в текстовой файл, то они уж слишком медленно загружались в текстовой файл.
Хотя я записывал их пот теми же 10 потоков.

Щас прислушался к вашему совету, буду пробовать создавать слова с помощи перебора слов, вот только пока что не знаю как это сделать.
0
Эксперт .NET
 Аватар для Rius
13163 / 7722 / 1679
Регистрация: 25.05.2015
Сообщений: 23,524
Записей в блоге: 14
06.12.2020, 16:43
Цитата Сообщение от QmlwZ Посмотреть сообщение
Хотя я записывал их пот теми же 10 потоков.
Файл-то один, наверное? Вот если разные файлы , да на разных дисках, тогда было бы заметно, может быть.
Цитата Сообщение от QmlwZ Посмотреть сообщение
вот только пока что не знаю как это сделать.
Подумайте над тем, как время отсчитывается в электронных часах. Ход часов - тот же перебор.
1
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
06.12.2020, 16:56  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Файл-то один, наверное? Вот если разные файлы , да на разных дисках, тогда было бы заметно, может быть.
Файл у меня был 1 на рабочем столе, я при записи туда слов указывал путь, потом добавлял туда слова.

Вот код как это было :
C#
1
2
3
4
using (StreamWriter stream = new StreamWriter($"{path}", true)) //{path} - это путь
                    {
                        stream.WriteLine(SgenChars); // SgenChars это сгенерированное слово.
                    }
Цитата Сообщение от Rius Посмотреть сообщение
Подумайте над тем, как время отсчитывается в электронных часах. Ход часов - тот же перебор.
Я раньше делал отсчет времени, запускал Timer и потом к label прибавлял значение при каждой секунде.
Что то сделал вроде этого но пока что не получается, смотрел на некоторых людей как они это сделали, не чего не понял, тем более слишком у них как то это все медленно генерируется.

Спасибо вам за направление. Буду копать дальше.
0
Эксперт .NET
 Аватар для Rius
13163 / 7722 / 1679
Регистрация: 25.05.2015
Сообщений: 23,524
Записей в блоге: 14
06.12.2020, 18:29
Лучший ответ Сообщение было отмечено QmlwZ как решение

Решение

Как-то так примерно
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
using System;
using System.Collections;
 
namespace QmlwZ
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var gen = new Generator(4, 'a', 'b', 'c', 'd');
 
            foreach (var item in gen) Console.WriteLine(item);
        }
    }
 
    internal class Generator
    {
        private readonly char[] _characters;
        private readonly int _length;
 
        public Generator(int length, params char[] characters)
        {
            _length = length;
            _characters = characters;
        }
 
        public IEnumerator GetEnumerator()
        {
            var buffer = new char[_length];
            var indexes = new int[_length];
            var max = _characters.Length;
            var isCompleted = false;
 
            while (!isCompleted)
            {
                for (var i = 0; i < _length; i++)
                    buffer[i] = _characters[indexes[i]];
 
                yield return new string(buffer);
 
                for (var j = 0; j < _length + 1; j++)
                {
                    if (j >= _length)
                    {
                        isCompleted = true;
                        break;
                    }
 
                    if (++indexes[j] < max)
                        break;
                    indexes[j] = 0;
                }
            }
        }
    }
}
1
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
06.12.2020, 20:17  [ТС]
Rius, вау! Спасибо вам большое за решение моей задачи!
Уже все проверил и все работает.

Но вот у меня остались маленькие вопросы:
Что значит вот этот код:

C#
1
2
for (var i = 0; i < _length; i++)
                    buffer[i] = _characters[indexes[i]];
А вот именно buffer[i] = _characters[indexes[i]];. Я не понимаю что мы записываем в buffer, в _characters есть символы "a, b, c, d", и мы в buffer записываем каждые из этих символах? Просто почему бы сделать вот так?
buffer[i] = _characters[i]?

Либо я не пойму зачем:
C#
1
2
3
if (++indexes[j] < max)
                        break;
                    indexes[j] = 0;
Ну а так спасибо вам большое что помогли мне!
0
Эксперт .NET
 Аватар для Rius
13163 / 7722 / 1679
Регистрация: 25.05.2015
Сообщений: 23,524
Записей в блоге: 14
06.12.2020, 20:25
Лучший ответ Сообщение было отмечено QmlwZ как решение

Решение

В массиве интов хранятся индексы символов в массиве символов.
Индексы инкрементируются, сбрасываются, переносятся, как я говорил ранее в часах. Или, если вы автомобилист, можете посмотреть на одометр.
Цитата Сообщение от QmlwZ Посмотреть сообщение
Что значит вот этот код:
Из индексов символов обновляется временный массив, из которого формируется строка.

Добавлено через 2 минуты
Цитата Сообщение от Rius Посмотреть сообщение
new Generator(4, 'a', 'b', 'c', 'd')
Здесь первый аргумент - длина получаемых слов, а второй - массив символов, из которых слова можно составлять.
Здесь 4 и 4 символа - совпадение.
1
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
06.12.2020, 20:32  [ТС]
Rius, то есть
C#
1
var indexes = new int[_length];
Хранит в себе индексы символов которые хранятся в _characters?
0
Эксперт .NET
 Аватар для Rius
13163 / 7722 / 1679
Регистрация: 25.05.2015
Сообщений: 23,524
Записей в блоге: 14
06.12.2020, 20:33
Лучший ответ Сообщение было отмечено QmlwZ как решение

Решение

Да.
0
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
06.12.2020, 20:34  [ТС]
Rius, Спасибо вам большое!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.12.2020, 20:34
Помогаю со студенческими работами здесь

Как узнать сколько потребляет оперативной памяти приложение при работе
Как узнать сколько потребляет оперативной памяти приложение при работе, что то по аналогии System.Diagnostics.Stopwatch. например...

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

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

Перегрузка памяти
Здравствуйте. Форум посоветовала подруга, которой здесь очень помогли. Проблема заключается в следующем. Рандомно компьютер зависает...

Перегрузка памяти
В общем, имеется код проекта. После ввода числа элементов, выбора в меню Тестирование -&gt; Битовая строка (при любом пункте в меню) -&gt;...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru