#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 обработками страниц
Комментариев нет:
Отправить комментарий