Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Petr Šťastný
Tvůrce
Avatar
Petr Šťastný:1.1.2018 17:20

Zdravím, mám jednu metodu, která volá API a chtěl jsem udělat crawlera, který by API používal k získání informací. Získal jsem povolení API využít s tím, že mezi dotazy bude nějaký časový úsek, takže nebudu příliš zatěžovat API. Takže jsem se chtěl zeptat - jaký je koretní způsob, jak bych udělal nějaký úsek mezi voláním metody? Metoda může trvat 20 ms nebo klidně i 20 vteřin, většinou to je něco kolem 50 ms.

Udělal bych to tak, že bych měl seznam toho, co chci volat, který by se postupně rozšiřoval a postupně bych volal API s parametrem v seznamu s tím, že mezi dotazy musí být alespoň 500ms. Je nějaký lepší způsob, jak to udělat, než že bych měl cyklus se Thread.Sleep při každé iteraci?

A další dotaz, každým dotazem doplním další položky do listu, který vyhledávám - jako když třeba indexujete web a každý odkaz předa další web, který prolezete, i když tohle není tento případ. Moje otázka zní - jakým způsob co nejrychleji zjistím, jestli jsem náhodou položku (v příkladu s indexováním webu: url adresu) neprolezl? Udržovat List<string> s tím, co jsem už prolezl mi přijde extrémně pomalé, protože každý průlez vygeneruje asi 80 nových položek k průlezu, přičemž velkou část z nich jsem už prolezl, nebo se už v listu k průlezu nacházejí. Jakým způsobem to udělám tak, aby to bylo co nejrychlejší?

Shrnutí:

  1. Lepší způsob časování než Sleep?
  2. Lepší způsob uchovávání věcí, co jsem už prolezl, než List a neustále pomalé procházení?

Díky, Petr

 
Odpovědět
1.1.2018 17:20
Avatar
Petr Šťastný
Tvůrce
Avatar
Petr Šťastný:1.1.2018 20:31

Dobře, tak teď už jenom potřebuju vědět jednu věc: Potřebuju zjistit, jestli v kolekci stringů už existuje daný string. Použil jsem ke kontrole HashSet, ale když jsem tam měl nějakých 1450 záznamů, tak už trvalo vteřiny, než jsem zjistil, jestli to string obsahuje nebo neobsahuje. Neznáte nějaký rychlejší způsob, jak zjistit, jestli kolekce obsahuje string?

 
Nahoru Odpovědět
1.1.2018 20:31
Avatar
Odpovídá na Petr Šťastný
Petr Štechmüller:2.1.2018 9:02

Ahoj, co místo obyčejného listu použít nějaké stromy? Třeba AVL nebo RedBlack stromy... Měly by mít rychlejší vyhledávání.

Nahoru Odpovědět
2.1.2018 9:02
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Marian Benčat:2.1.2018 9:51

Sestav si TRII (trie). Bude to mít složitost vyhledávání konstantní, podle délky stringu.

Editováno 2.1.2018 9:52
Nahoru Odpovědět
2.1.2018 9:51
Totalitní admini..
Avatar
Marian Benčat:2.1.2018 9:53

Navíc, jsi schopný hledat i všechny substringy zároveň třeba podle Aho-corrasicku, podobně jako to dělá třeba T9 tka.

Nahoru Odpovědět
2.1.2018 9:53
Totalitní admini..
Avatar
Petr Šťastný
Tvůrce
Avatar
Odpovídá na Marian Benčat
Petr Šťastný:2.1.2018 12:47

Díky, vypadá to dobře, vyzkouším to :)

 
Nahoru Odpovědět
2.1.2018 12:47
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.