Diskuze: Jak volat metodu maximálně jednou za určitý časový úsek

C# .NET .NET (C# a Visual Basic) Jak volat metodu maximálně jednou za určitý časový úsek American English version English version

Aktivity (3)
Avatar
Petr Stastny
Redaktor
Avatar
Petr Stastny:1. ledna 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. ledna 17:20
Avatar
Petr Stastny
Redaktor
Avatar
Petr Stastny:1. ledna 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. ledna 20:31
Avatar
Odpovídá na Petr Stastny
Petr Štechmüller:2. ledna 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. ledna 9:02
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:2. ledna 9:51

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

Editováno 2. ledna 9:52
Nahoru Odpovědět  +1 2. ledna 9:51
In Smalltalk, everything is an object, In Clojure, everything is a list, In Javascript, everything is fucking mistake
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:2. ledna 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. ledna 9:53
In Smalltalk, everything is an object, In Clojure, everything is a list, In Javascript, everything is fucking mistake
Avatar
Petr Stastny
Redaktor
Avatar
Odpovídá na Marian Benčat
Petr Stastny:2. ledna 12:47

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

 
Nahoru Odpovědět 2. ledna 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.