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

  • Автор темы Автор темы alekwuy
  • Дата начала Дата начала

alekwuy

Client
Регистрация
06.04.2013
Сообщения
1 632
Реакции
460
Баллы
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";

Подскажите в чем может быть проблема?

Может у кого то есть сниппет получше?)
 
Так если он не берет со списка, то может можно и не лочить? Или создать внутренний список.
 
  • Оценить
Реакции: alekwuy и Mikhail B.
C#:
Развернуть Свернуть Копировать
var textContains = project.Variables["url"].Value;
var sourceList = project.Lists["black"];
return sourceList.Contains(textContains);
не уверен, что работает)
 
  • Оценить
Реакции: alekwuy
если список синхронизирован с файлом нужно обязательно лочить. Если не синхронизирован то необязательно
 
  • Оценить
Реакции: deopl
  • Оценить
Реакции: alekwuy
если не лочить и в это время другой поток добавляет запись
все будет ок?
я думаю, что нужно лочить, если ты просто читаешь список. Всегда думал, что лок нужен на случай, чтобы потоки не сталкивались лбами при записи. Пусть меня поправят, если я не прав.
 
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));
 
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 ?)
 
я если не беру строку из списка никогда не лочу, пока проблем не наблюдал
 
  • Оценить
Реакции: alekwuy
спасибо, а ты как думаешь в многопотоке нужно блочить список?

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

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