Многопоточная работа с блэклистом

alekwuy

Client
Регистрация
06.04.2013
Сообщения
1 631
Благодарностей
461
Баллы
83
Есть шаблон пасрер который парсит ссылки и проверяет из по блэклисту через сниппет
так вот проблема в том что время выполнения проверки по блэку растет с каждым потоком.
в блэке 500к ссылок(50мб)
время обработки 5 сек на 1 потоке
на 5 потоках время обработки сниппета в каждом потоке 25 сек
такое ощущение что работа идет по очереди, а не одновременно, проверил на 2х компах

сниппет был найден на форуме
Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["url"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["black"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        // читаем строку из списка
        var str = sourceList[i];
        // проверяем содержание текста в строке, если есть совпадение возвращаем "yes"
        if (str.Contains(textContains))
            return "True";
    }
}
// если ничего не нашли возвращаем "no"
return "False";
Подскажите в чем может быть проблема?

Может у кого то есть сниппет получше?)
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
конечно по очереди, ты же лочишь доступ к списку на время выполнения
 
  • Спасибо
Реакции: alekwuy

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Так если он не берет со списка, то может можно и не лочить? Или создать внутренний список.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
  • Спасибо
Реакции: alekwuy и Mikhail B.

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
C#:
var textContains = project.Variables["url"].Value;
var sourceList = project.Lists["black"];
return sourceList.Contains(textContains);
не уверен, что работает)
 
  • Спасибо
Реакции: alekwuy

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
если список синхронизирован с файлом нужно обязательно лочить. Если не синхронизирован то необязательно
 
  • Спасибо
Реакции: deopl

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
  • Спасибо
Реакции: alekwuy

alekwuy

Client
Регистрация
06.04.2013
Сообщения
1 631
Благодарностей
461
Баллы
83

alekwuy

Client
Регистрация
06.04.2013
Сообщения
1 631
Благодарностей
461
Баллы
83
кстати спасибо, понял почему раньше были проблемы с другими шаблонами и паралельной работой
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
если не лочить и в это время другой поток добавляет запись
все будет ок?
я думаю, что нужно лочить, если ты просто читаешь список. Всегда думал, что лок нужен на случай, чтобы потоки не сталкивались лбами при записи. Пусть меня поправят, если я не прав.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
C#:
return project.Lists["black"].First(s=>s.Contains(project.Variables["url"].Value));
если есть совпадение вернёт строку, если нет то по красной

если лочить то так
C#:
lock(SyncObjects.ListSyncer)
return project.Lists["black"].First(s=>s.Contains(project.Variables["url"].Value));
 

alekwuy

Client
Регистрация
06.04.2013
Сообщения
1 631
Благодарностей
461
Баллы
83
C#:
return project.Lists["black"].First(s=>s.Contains(project.Variables["url"].Value));
если есть совпадение вернёт строку, если нет то по красной

если лочить то так
C#:
lock(SyncObjects.ListSyncer)
return project.Lists["black"].First(s=>s.Contains(project.Variables["url"].Value));
спасибо, а ты как думаешь в многопотоке нужно блочить список?

а можешь сделать с true и false ?)
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
я если не беру строку из списка никогда не лочу, пока проблем не наблюдал
 
  • Спасибо
Реакции: alekwuy

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
спасибо, а ты как думаешь в многопотоке нужно блочить список?

а можешь сделать с true и false ?)
так я ведь написал, если такая строка есть то по зелёной, если нет то по красной пойдёт
 
  • Спасибо
Реакции: alekwuy

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
так я ведь написал, если такая строка есть то по зелёной, если нет то по красной пойдёт
думаю, желание заключалось именно в возвращении в переменной True либо False
 
  • Спасибо
Реакции: alekwuy

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