#c_sharp #winforms
Как увеличить скорость сбора в разы ?
Если делаю дополнительные потоки с Algoritm2 Algoritm3 и т.д.
То такое ощущение, что скорость распределяется, а не увеличивается.
При этом мощности компьютера и интернет канала полно...
UPD: Не асинхронно, а отдельными потоками в которых всё будет синхронно
using System;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ParsingImena
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
var algoritm1 = new Task(Algoritm1);
algoritm1.Start();
}// Загрузка формы
private string PoluchitImya(string nomerStranici)
{
System.Net.WebClient wc = new System.Net.WebClient();
String Response = wc.DownloadString("https://site.com/" + nomerStranici);
String Rate = System.Text.RegularExpressions.Regex.Match(Response,
@"itemprop=""name"">([^<]+)").Groups[1].Value;
return Rate;
}// Получение имени
private void Algoritm1()
{
for (int i = 1; i < 100000; i++)
{
string nomerStranici = i.ToString();
string r = PoluchitImya(nomerStranici);
BeginInvoke(new InvokeDelegate(pisanina), r);
BeginInvoke(new InvokeDelegateLable1(pisaninaLable1), i);
}
}// Алгоритм работы 1
#region Делегаты
public delegate void InvokeDelegate(string r);
public void pisanina(string r)
{
if (r != "")
{
File.AppendAllText("log.txt", r + Environment.NewLine);
}
}
public delegate void InvokeDelegateLable1(int i);
public void pisaninaLable1(int i)
{
label1.Text = i.ToString();
}
#endregion
}
}
Ответы
Ответ 1
Расскажу, как это делать более правильно (не идеально, но чуть лучше, чем у вас). Итак, что мы хотим? Мы хотим ускорить загрузку и обработку страничек. За счет чего это можно сделать? За счет асинхронной загрузки и параллельной обработки. Ниже будет пример парсинга нашего сайта SO - я распарсю только несколько страничек, для примера (и чтобы не забанили :)) Как грузить страничку асинхронно? async TaskLoad(string uri) { using (var client = new HttpClient()) { var res = await client.GetStringAsync(uri); // асинхронная загрузка return res; } } Для удобрства, я напишу метод, который принимает номер страницы Task LoadPage(int page) { return Load($"https://ru.stackoverflow.com/questions/tagged/c%23?page={page}"); } Так, я хочу вытащить из страницы вопросы - заголовок вопроса и его Url. То есть мне нужен класс вопроса public class Question { public string Url {get;set;} public string Title {get;set;} } И способ, как вопросы вытащить со страницы. Я поспользуюсь библиотекой HtmlAgilityPack Question[] GetQuestions(string content) { var doc = new HtmlDocument(); doc.LoadHtml(content); var nodes = doc.DocumentNode.SelectNodes("//*[@class='question-summary']//*/h3/a") .Select(x => new Question() { Title = x.InnerText, Url = x.Attributes["href"].Value }) .ToArray(); return nodes; } Ну и осталось написать метод, который загрузит страничку, распарсит её и вернет список вопросов async Task GetQuestions(int page) { var str = await LoadPage(page); return GetQuestions(str); } Как это запустить? async Task Main() { // грузим 10 страниц var tasks = Enumerable.Range(1, 10) .Select(x=>GetQuestions(x)) .ToArray(); await Task.WhenAll(tasks); // ждем, когда все загрузится // вывод в консоль foreach(var question in tasks.SelectMany(x=>x.Result)) { Console.WriteLine(question.Title); } } Результат - примерно 150 вопросов с 10 страниц было скачано и распарсено за 0,8 секунды Увеличить скорость парсера Как сделать поиск по слову по listbox? Освобождение ресурсов Cannot open database requested by the login C# функции, подпрограммы [требует правки] Изменения стиля внутренних контролов у UserControl'а ........../* тут ещё куча текста*/.......... Событие на нажатие кнопки мыши вне элемента управления. C#. Windows Forms c#, Graphics.DrawString(), InvalidOperationException Привязка анимации WPF Как пропустить unauthorized access exception [дубликат] Добавить текст к имеющемуся И не забудьте все это запускать в отдельном большом таске (по типу как у вас var algoritm1 = new Task(Algoritm1);), чтобы не грузить UI обработками страниц
Комментариев нет:
Отправить комментарий