Списки не вывозят такие скорости. Только БД. Ее еще оптимизировать придетсяОфигеть сайтег! Где ты такие находишь?
Проверенные записывать в список и сверять, если есть, то брать следующий. Неподойдет?
это на много больше мороки и информации придется обрабатывать. никак не подойдетПроверенные записывать в список и сверять
не не не, не так, не правильно поняли походу.Списки не вывозят такие скорости. Только БД. Ее еще оптимизировать придется
+ может банально в интернет уперется
Ну и сама зенка может тупо не потянуть.
Ну а если не в файл а в БД?ну есть конечно более тупой варик, это сделать текстовый файл с 2 млн строк (500 файлов таких) где разбить число в 2 млрд и брать от туда числа как из списка, ну это лол конечно, я думаю должен быть более элегантный способ
СУБД юзать надо, никаких файлов/списков/таблиц. Сразу производительность с ними просядет в разы.ну есть конечно более тупой варик, это сделать текстовый файл с 2 млн строк (500 файлов таких) где разбить число в 2 млрд и брать от туда числа как из списка, ну это лол конечно, я думаю должен быть более элегантный способ
тоже так думаю, надо прогеров привлекатьуже 100% есть такого рода решения, просто мы о них не в курсе)
Зачем. Придумывать. Такую. Сложную. Логику?создать список диапазонов
0|1000000
1000000|2000000
2000000|3000000
каждый поток берет строку с диапазоном и левое число увеличивает на единицу.
Предположим, что в списке 2000 таких строк. каждый поток берет такую строку при старте и работает с ней какоето время и если не сравнял правое число с левым перезаписывает обратно в список, чтоб в следующий раз продолжить.Зачем. Придумывать. Такую. Сложную. Логику?
Есть же СУБД
Просите @Mikhail B. чтоб тот подробно рассказал как многопоток в зенке с СУБД с похожей задаче забил весь канал и почти не использовал ресурсы (ЦП, ОЗУ)
Не люби себе и людям мозги, именно так и сделай. Вангую что и так донора лучше парсить не больше чем 10...50 потоков, а то если админы не спят, то прикрутят гайки. А для такого количества потоков вполне хватит работы с списками-файлами по 3…10 мб. Даже RAM-диска не надо будет....Создавать списки с номерами и брать от туда, можно, но очень не хочется.
\Input\part\Output_1.txt
\Input\part\Output_2.txt
…..
\Input\part\Output_2000.txt
var useragent = project.Variables["UserAgent"].Value;
int count = 0;
int count2 = 0;
for (int i = 0; i < 1000; i++)
{
if (Global.Variables.IsProjectMaker && !Global.Variables.IsDebugMode) throw new Exception();
if (((ZennoLab.InterfacesLibrary.ProjectModel.Collections.IContextExt)project.Context).IsInterrupted) throw new Exception();
var pages = new List<object>().Select(t => new { Count = default(int) }).ToList();
for (int j = count; j < count2 + 50; j++)
{
count++;
pages.Add(new { Count = count });
}
count2 = count;
var sb = new StringBuilder();
System.Threading.Tasks.Parallel.ForEach(pages, p =>
{
using (var request = new HttpRequest())
{
try
{
var url = "https://yandex.ru/";
request.ReconnectLimit = 3;
request.ReconnectDelay = 50;
request.KeepAlive = true;
request.UserAgent = useragent;
request.AllowAutoRedirect = true;
request.IgnoreProtocolErrors = true;
request.EnableEncodingContent = true;
request.MaximumAutomaticRedirections = 5;
request["Upgrade-Insecure-Requests"] = "1";
request["Accept-Language"] = "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7";
request["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3";
bool status = request.Get(url).IsOK;
if (status)
{
project.SendInfoToLog("", "Status -> " + status + " -> Count -> " + p.Count.ToString(), true);
sb.Append(p.Count.ToString() + "|");
}
}
catch (HttpException e)
{
string answer = string.Empty;
switch (e.Status)
{
case HttpExceptionStatus.Other:
answer = "Неизвестная ошибка";
break;
case HttpExceptionStatus.ProtocolError:
answer = "Код состояния: " + (int)e.HttpStatusCode;
break;
case HttpExceptionStatus.ConnectFailure:
answer = "Не удалось соединиться с HTTP-сервером";
break;
case HttpExceptionStatus.SendFailure:
answer = "Не удалось отправить запрос HTTP-серверу";
break;
case HttpExceptionStatus.ReceiveFailure:
answer = "Не удалось загрузить ответ от HTTP-сервера";
break;
}
project.SendErrorToLog("", answer, true);
}
}
});
project.SendInfoToLog("", "Обработанно " + count2 + " страгиц", true);
var list = sb.ToString().Split(new string[]{ "|" }, StringSplitOptions.RemoveEmptyEntries);
FileSystem.FileAppendString(project.Directory + "\\Result.txt", string.Join("\r\n", list), true);
}