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

  • Автор темы Автор темы Mikhail B.
  • Дата начала Дата начала

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 449
Реакции
5 478
Баллы
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%, аж так, что шаблон медленней работает.
Как снизить нагрузку на процессор? Может убрать лишние локи, проверки на существование файла?
Может БД использовать?
 
У тебя же вечный цикл.
C#:
Развернуть Свернуть Копировать
while(true)
{
lock(SyncObjects.ListSyncer)
{
   if (url2 != "")
   {
   Names.Add(url2);
     return "Ok";
   }
}
 
  • Оценить
Реакции: Mikhail B.
Выход, но если url2 будет пустой, то он застрянет в цикле.
Ого! А можешь исправить? Если пустой просто пусть выходит по удаче и ничего не записывает. Ну можно по неудаче. Главное что бы пустоту не записал в список.
 
А что он делает? Я думал это проверка на наличие файла, но как она в цикл загояет не совсем понял.

И еще вопрос. Это лочить не обязательно? Чтение в многопотоке же по идее не должно файл повредить?
C#:
Развернуть Свернуть Копировать
lock (SyncObjects.ListSyncer)
{
IZennoList Names = project.Lists["BLACKLIST-USER"]; //привязываемся к списку
string Element = project.Variables["User_ID"].Value;
return Names.Contains(Element); // True/False
}
 
  • Оценить
Реакции: Sz5
А что он делает?
Как 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.
Нет, но может не всегда быть допустимо в логике шаба. Например, только получил номер строки, а её уже снёс другой поток.
Стирание строк не предусмотрено, это же блеклист, он только растет. Может еще какие то приемы есть, что бы хоть как то снизить нагрузку?
Как if, только зацикленный:
Спасибо за разъяснение.
 
А блэк на сколько строк?

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

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

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


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

Предполагаю это тоже создает нагрузку. Если например записывать только половину от этих данных это даст прирост определенный?
 
Напрямую? Ну я и так с текстовиком работаю напрямую.
Список зенки, это копия файла в оперативке, но больше размером.
Если например записывать только половину от этих данных это даст прирост определенный?
Я бы попробовал, работу с пустым списком и списками разных размеров, для точного определения, а список ли нагружает.
 
Последнее редактирование:
Зачем ты инициализируешь список в локе? Это замедляем работу.
Выноси его:
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. и ZX
Если просто берешь список и в это время другой поток не добавляет в список новую запись, то вообще убирай локи.
Запись добавляется постоянно.
Вынести BLACKLIST в базу данных.
Для меня это неизведанная тема. Почитал бы пару статей интересных если есть на форуме =)
 
Ребят помогли советы. Походу и правда был цикл и процессор забивался. Сейчас нагрузка вобще нормальная как и была до этого.
Все сделал как сказали, только БД я пока не готов использовать. Посмотрим как себя списки покажут.
 
  • Оценить
Реакции: ZX
  • Оценить
Реакции: Mikhail B.
Или даже работай с файлом напрямую:
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.

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