Работа в 300 потоков через GET - ускорить?

TotKto

Client
Регистрация
12.07.2013
Сообщения
123
Благодарностей
12
Баллы
18
Буду рад вашим подсказкам
Есть шаблон
Логика -
1) Берем строку из текстового файла
2) Делаем гет-запрос
3) Записываем результат в текстовый файл

Браузер отключен
Все очень просто

На 100 потоках получается 1000 результатов в минуту
Мало
Запускаю на 300 потоков
Результат 800 в минуту

Еще меньше чем в 100 потоках

Подозреваю из-за того что мы читаем и записываем в один и тот же файл на всех потоках
Как можно ускорить работу?
какие есть варианты работы на 300-400 потоках с записью - чтением файлов?

Спасибо
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 427
Благодарностей
5 453
Баллы
113
Мне несколько раз советовали использовать базы данных, но как то дело не дошло. Возможно это бы решило ситуацию.
 
  • Спасибо
Реакции: TotKto и Lord_Alfred

one

Client
Регистрация
22.09.2015
Сообщения
6 831
Благодарностей
1 275
Баллы
113
Я рекомендую в работе с многопотоками отказаться работать с файлами для получения исходных данных а использовать БД. Тут есть несколько, на обьемах заметных фактора - скорость, надежность, нагрузка.

А конкретно по Вашему случаю получается так что в первом варианте задачу обслуживает 100 ресурсов сервера во втором 300 плюс надо учитывать тот момент, что инстансы в постере выполняются последовательно.
 
Последнее редактирование:
  • Спасибо
Реакции: TotKto

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 551
Баллы
113
На 100 потоках получается 1000 результатов в минуту
Мало
Запускаю на 300 потоков
Результат 800 в минуту

Еще меньше чем в 100 потоках
Так же это может из-за забитого интернет канала.

надо учитывать тот момент, что инстансы в постере выполняются последовательно.
Внимательнее :-)
Браузер отключен
 
  • Спасибо
Реакции: TotKto и one

yriy158

Client
Регистрация
10.08.2013
Сообщения
491
Благодарностей
303
Баллы
63
Была такая же ситуация, ничего не помогало пока ее перешел на базы данных. Уверен на 99% что поможет.
 
  • Спасибо
Реакции: [Pacman] и TotKto

sydoow

Client
Регистрация
22.06.2011
Сообщения
289
Благодарностей
149
Баллы
43
Я с таким сталкивался, когда парсил один сайт: первый файл - список урлов, второй файл - резалт парсинга урлов.

Вообщем придумал такую штуку.

Сделал 100 циклов выполнения шаба (то есть 100 урлов парсилось за 1 выполнение), но запись в файлы была только в начале и в конце шаблона.
Все данные, пока шёл цикл в 100 итераций, сохранялись во временные списки (не привязанные к файлам): в начале шаба - бралось 100 урлов из файла во временный список1, в конце шаба - писалось 100 резалтов в файл из темпового списка2.

Таким образом снизил колво обращений потоков к файлам - скорость сильно увеличил.

Надеюсь понятно описал :-)
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 866
Баллы
113
Если с базами данных категорически не хочется связываться (а зря, т.к. я тоже в первую очередь посоветовал бы их), то можно попробовать извернуться и поставить себе RAMDisk и писать/читать данные с файлов с этого диска.
Слышал (первый спойлер), что помогает такое
 
  • Спасибо
Реакции: TotKto и ibred

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 183
Баллы
113
Если с базами данных категорически не хочется связываться (а зря, т.к. я тоже в первую очередь посоветовал бы их), то можно попробовать извернуться и поставить себе RAMDisk и писать/читать данные с файлов с этого диска.
Слышал (первый спойлер), что помогает такое
Ну раз так часто последнее время интересуются Рам-дисками, то я в той теме вывел отдельный спойлер по нему:
*************************************
Что такое RAM-диск и как его создать
«RAM-диск» - это технология, позволяющая использовать часть системной оперативной памяти как дополнительное дисковое устройство, то есть «сверхбыстрый» мини-диск.
Сделать такое можно программой «SoftPerfect RAM Disk 3.4.8 Free». Уже есть версия 4, но она платная, можете искать ломанную на варез-трекерах; 3.4.5 версия идет в комплекте с Total Commander PowerUser (тот черный командер, который на моих видео). Из гугла по ней: обзор1, обзор2, видео. Отдельно стоит заметить, что в случае перезагрузки ПК - данные с рамдиска стираются.
*************************************
 
Последнее редактирование:

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 866
Баллы
113
Отдельно стоит заметить, что в случае перезагрузки - данные с рамдиска стираются (что по логике понятно, но на всякий случай лучше это упомянуть лишний раз).

PS: лично я юзаю рамдиск для "Trash" в настройках ZennoPoster (Инстанс -> Путь к кукам и кэшу). Особого прироста не замечал, но зато не забивается основной диск кучей файлов и профилей, которые генерируются во время работы ZP.

PPS:
3) Записываем результат в текстовый файл
Подозреваю из-за того что мы читаем и записываем в один и тот же файл на всех потоках
Если использовать файл, в который пишется результат как "список", то 100% будут блокировки этого файла при чтении/записи между потоками. А если просто использовать экшен "Файлы" и "дозаписывать в конец", то скорее всего таким образом можно ещё вытянуть дополнительную скорость.
 
  • Спасибо
Реакции: TotKto и orka13

Мирон

Client
Регистрация
15.10.2015
Сообщения
29
Благодарностей
8
Баллы
3
Попробовать данные писать во временный список и в конце работы или когда нужно переписать в файл.
Код:
using TT;


namespace TT
{
    public class ListA
    {
        public static List<string> Spisok = new List<string>();
    }
   
}
К общему коду добавьте чтото вроде этого и пишите в лист через: TT.ListA.Spisok.Add("");
 

Кличко

Пользователь
Регистрация
22.03.2019
Сообщения
103
Благодарностей
5
Баллы
18
К общему коду добавьте чтото вроде этого и пишите в лист через: TT.ListA.Spisok.Add("");
А как взять строку с удалением и взять все данные из такого списка... в общем тема не раскрыта, добавление вроде срабатывает
 

Remart

Client
Регистрация
06.10.2016
Сообщения
52
Благодарностей
10
Баллы
8
Попробовать данные писать во временный список и в конце работы или когда нужно переписать в файл.
Код:
using TT;


namespace TT
{
    public class ListA
    {
        public static List<string> Spisok = new List<string>();
    }
  
}
К общему коду добавьте чтото вроде этого и пишите в лист через: TT.ListA.Spisok.Add("");
Я правильно понимаю, что если список используется в цикле и в его конце стирается, то лучше переделать во временный список?
 

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