Высокая нагрузка на процессор из-за частого чтения записи списка

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
Народ такая проблема. Сделал блек лист.
1)
C#:
lock (SyncObjects.ListSyncer)
{
IZennoList Names = project.Lists["BLACKLIST-USER"]; //привязываемся к списку
string Element = project.Variables["User_ID"].Value;
return Names.Contains(Element); // True/False
}
2) Если True то уходим на паузу 5 сек и пробуем с новым User_ID.
3) Если False, то добавляю строку в локе, потом 5 сек и пункт 1.
C#:
IZennoList Names = project.Lists["TEMP-PROXY"]; //привязываемся к списку
var url2 = project.Variables["result"].Value;
while(true)
{
lock(SyncObjects.ListSyncer)
{
   if (url2 != "")
   {
   Names.Add(url2);
     return "Ok";
   }
}
}
Все это в многопотоке. Процессор грузит под 100%, аж так, что шаблон медленней работает.
Как снизить нагрузку на процессор? Может убрать лишние локи, проверки на существование файла?
Может БД использовать?
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 485
Благодарностей
3 356
Баллы
113
У тебя же вечный цикл.
C#:
while(true)
{
lock(SyncObjects.ListSyncer)
{
   if (url2 != "")
   {
   Names.Add(url2);
     return "Ok";
   }
}
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 485
Благодарностей
3 356
Баллы
113
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
Выход, но если url2 будет пустой, то он застрянет в цикле.
Ого! А можешь исправить? Если пустой просто пусть выходит по удаче и ничего не записывает. Ну можно по неудаче. Главное что бы пустоту не записал в список.
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 485
Благодарностей
3 356
Баллы
113

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
А что он делает? Я думал это проверка на наличие файла, но как она в цикл загояет не совсем понял.

И еще вопрос. Это лочить не обязательно? Чтение в многопотоке же по идее не должно файл повредить?
C#:
lock (SyncObjects.ListSyncer)
{
IZennoList Names = project.Lists["BLACKLIST-USER"]; //привязываемся к списку
string Element = project.Variables["User_ID"].Value;
return Names.Contains(Element); // True/False
}
 
  • Спасибо
Реакции: Sz5

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 485
Благодарностей
3 356
Баллы
113
А что он делает?
Как if, только зацикленный:
C#:
int i = 0;
while(i < 5)
{
    project.SendWarningToLog(i.ToString());
    i++;
}
project.SendWarningToLog("End");
Я думал это проверка на наличие файла
Вот проверка:
C#:
if(File.Exists(@"C:\test.txt")) return "тут";
Это лочить не обязательно? Чтение в многопотоке же по идее не должно файл повредить?
Нет, но может не всегда быть допустимо в логике шаба. Например, только получил номер строки, а её уже снёс другой поток.
 
  • Спасибо
Реакции: kagorec и Mikhail B.

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
Нет, но может не всегда быть допустимо в логике шаба. Например, только получил номер строки, а её уже снёс другой поток.
Стирание строк не предусмотрено, это же блеклист, он только растет. Может еще какие то приемы есть, что бы хоть как то снизить нагрузку?
Как if, только зацикленный:
Спасибо за разъяснение.
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 485
Благодарностей
3 356
Баллы
113
А блэк на сколько строк?

Как вариант, пробовать работать с файлом на прямую, но увеличится нагрузка на диск. Насчёт проца сложно сказать, но памяти без списков станет побольше.
 
Последнее редактирование:

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
А блэк на сколько строк?
Постоянно растет. Ну пока в планах не превышать 50к строк.

Как вариант, пробовать работать с файлом на прямую, но увеличится нагрузка на диск.
Напрямую? Ну я и так с текстовиком работаю напрямую.

Насчёт проца сложно сказать, но памяти без списков станет побольше.
Память оперативная? Да она не особо интересует меня. т.к. шаб на запросах и жрет понты по памяти и ресурсам. вот с блеклистом ситуация вышла не удачная.


+ еще строки такого вида
26a536c8f2dbcc2d637181fb097526ca

Предполагаю это тоже создает нагрузку. Если например записывать только половину от этих данных это даст прирост определенный?
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 485
Благодарностей
3 356
Баллы
113
Напрямую? Ну я и так с текстовиком работаю напрямую.
Список зенки, это копия файла в оперативке, но больше размером.
Если например записывать только половину от этих данных это даст прирост определенный?
Я бы попробовал, работу с пустым списком и списками разных размеров, для точного определения, а список ли нагружает.
 
Последнее редактирование:

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
  • Спасибо
Реакции: Yuriy Zymlex и zortexx

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63
Зачем ты инициализируешь список в локе? Это замедляем работу.
Выноси его:
PHP:
IZennoList Names = project.Lists["BLACKLIST-USER"]; //привязываемся к списку

lock (SyncObjects.ListSyncer)
{
string Element = project.Variables["User_ID"].Value;
return Names.Contains(Element); // True/False
}
Если просто берешь список и в это время другой поток не добавляет в список новую запись, то вообще убирай локи. Или даже работай с файлом напрямую:

PHP:
List<string> Names = new List<string>();

string[] lines = File.ReadAllLines(project.Directory + @"\Names.txt");
for (int i=0; i<lines.Length; i++) Names.Add(lines[i]);
 
  • Спасибо
Реакции: Mikhail B. и Yuriy Zymlex

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
Если просто берешь список и в это время другой поток не добавляет в список новую запись, то вообще убирай локи.
Запись добавляется постоянно.
Вынести BLACKLIST в базу данных.
Для меня это неизведанная тема. Почитал бы пару статей интересных если есть на форуме =)
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
Ребят помогли советы. Походу и правда был цикл и процессор забивался. Сейчас нагрузка вобще нормальная как и была до этого.
Все сделал как сказали, только БД я пока не готов использовать. Посмотрим как себя списки покажут.
 
  • Спасибо
Реакции: Yuriy Zymlex

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
Или даже работай с файлом напрямую:
PHP:
List<string> Names = new List<string>();

string[] lines = File.ReadAllLines(project.Directory + @"\Names.txt");
for (int i=0; i<lines.Length; i++) Names.Add(lines[i]);
Подскажи, если использовать данный метод, то привязывать списки в шаблоне не нужно?
 

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63
Подскажи, если использовать данный метод, то привязывать списки в шаблоне не нужно?
Если работаешь в одном снипете с ним, то не нужно. Если нужна запись в многопотоке, то используй это
 
  • Спасибо
Реакции: Mikhail B.

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)