Skip to content
This repository has been archived by the owner on Jan 27, 2024. It is now read-only.

Opravy chyb zrychlení a vylepšení #50

Merged
merged 27 commits into from
May 22, 2021
Merged

Opravy chyb zrychlení a vylepšení #50

merged 27 commits into from
May 22, 2021

Conversation

vladodriver
Copy link
Contributor

@vladodriver vladodriver commented Apr 26, 2021

Po vylepšení tohoto projektu, další vývoj opouštím a tak nabízím sloučení svých úprav mého forku: https://gitlab.com/vladodriver/uld pro užitek tohoto projektu

Opraveno:

  • RFE: implement watchdog for downloading threads #44 - nyní se nestane aby jakákoliv chyba způsobila nestažení části
  • výsledky úspěchu / neúspěchu jsou důkladně detekovány a zobrazeny ve statistice
  • příšerná rychlost a časté selhávání torpy byla nahrazena 3x rychlejším použitím stem + request.session()
  • benchmark => 100 linků torpy: za 22minut17sec vs. stem: 7minut23sec
  • otestováno monoha set GB staženími. Na linuxu vše OK
  • občasná ctrl+c ukončení s chybami

Neopravemo:

Vylepšení a změny

  • Data stahuje přímo do jednoho souboru, odpadá spojování částí do jednoho. Žádné části a spojování. Více na: https://gitlab.com/vladodriver/uld/-/blob/main/README.md#zm%C4%9Bny-a-nov%C3%A9-funkce
  • Během řešení download linků zobrazuje statistiku pokusů např: :) [Ok: 11 / 17] :( [Badcp: 2 Limited: 4 Censored: 0 NetErr: 0]
  • Rychlost získávání download linků (změna torpy -> stem viz. výše)
  • Cache download linků pro pokračující stahování s validací neplatných. Při pokračování downloadu (klidně příští den) se tedy řeší jen ty linky, co chybí do počtu stahovaných segmentů a z cache se načtou ty časově platné (dle tm=dddddddd). Limit je nyní 30 minut na (IP, url_souboru) a aktivuje se vždy když se nepočká >= 30 minut. Až pak je možno znovu tento pár (IP, url_souboru) využít. Když se použije dříve, limit se resetuje zpět na 30 minut. Takže tato funkce šetří použité IP / na jeden soubor při re-downloadu a umožňuje aby jich zůstalo bylo více pro ostatní uživatele. S .ucache souborem lze tedy stahovat ihned plnou rychlostí bez TORu a získávání linků např. u 100 partů při 12GB souboru při 150Mb/s cca 3x rychleji a přitom cache soubor má jen 28Kb takže ho lze snadno sdílet. Proto soubor .ucache zůstává i po dostažení narozdíl od souboru .udown.
    --Statistika celkové velikosti uložených dat a rychlosti na 2. řádku dole

@vladodriver vladodriver changed the title Use stem instead of torpy (is 2.5x faster), add colored statistics(all ok badc limit neterr ...), fix some bugs Opravy chyb zrychlení a vylepšení May 5, 2021
@sopos
Copy link

sopos commented May 6, 2021

ten výčet fixů a fíčur je parádní..

Bohužel to vypadá, že @setnicka opustil tento projekt taky, protože komunikace vázne a PR nejsou zpracovávány. :-(

@vladodriver, každopádně vyzkouším tvůj fork

@stinovlas
Copy link
Contributor

Vyzkoušel jsem fork a změny mi přijdou z uživatelského hlediska velmi dobré (do kódu jsem zatím moc nekoukal, takže ten nehodnotím). Jsem pro sloučení 👍.

@setnicka
Copy link
Owner

Už jsem si zase konečně našel nějaký čas na tenhle projekt. Sypu si popel na hlavu za dlouhé nereagování (neměl jsem na to nějak kapacitu) a pokusím se tuhle velkou várku změn prohlédnout. Z prvotního prohlédnutí se mi to dost líbí :)

@vladodriver
Copy link
Contributor Author

vladodriver commented May 21, 2021

Hlavně to vyzkoušet. Vyvinuto denním používáním. Začalo to bugem 44 Mělo to svý mouchy. I já nějaký přidával a zase spravoval. Pak jsem se podíval na Vzum a pustil ho ve wine .. bylo to rychlejší .. o dost.. použití stemu nebylo těžké a výsledek byl překvapivý (u mne až 3x rchleji), pak nějaký kód co tam sem tam přebýval z jiných verzí.. Detekce SlowCaptcha SlowDirect a Fast fungovala tak nějak divně (po stránce kódu). Postupně jsem to rozlouskl (pronikl do uspořádání kódu) a trochu porozdělil.

Přidal jsem statistiku (v podstatě testování za běhu..) A pak přišla ta správná zábava - stahovat segmenty rovnou do řídkého souboru (ala bittorent, axel aria2..) Tohle jsem implementoval v životě poprvé. Má to velkou fragmentaci. Je to naivní implementace bez zamykání ale funguje proto, že status soubor .udown je binární a stav i data se zapisují jen do své vlastní byte-ové části, takže nedochází k přepsání jednoho procesu druhým při zápisu. Status soubor se pak v jiném procesu jen čte a sčítají se čísla uložených dat, z čehož vzniklo monitorování velikosti stažení a okamžité rychlosti.
Nijak to neovlivňuje výkon a to původní spojování 100 částí dohromady, to byla fakt náročná operace. U ssd to docela nevadilo ale u HDD, to byla bouře.. U notebooku to bylo fakt horký.. A ani Vzum to rovnou do souboru nemá, takže jsme zase o krok před nimi .. :)

A ty linky jsou cenné.. (jdou získat jen 2 za půl hodiny / soubor a1 IP poctivě testováno). Ta půlhodina se resetuje při jakémkoliv dalším pokusu. Jedna IP+soubor tak může být blokobaná klidně celý den. Tor má tisíce exit nodů, ale to nemusí být moc, když se během jedný půlhodiny rozhodne takto stahovat soubor třeba 100 lidí... Při navázání stahování a nová těžba drahocenných linků zbytečně... Platnost linků je 2 dny. Když se začne stahovat i poslední 3 vteřiny před vypršením, tak to stahování dojede, když se spojení nezavře. A když ano link se invaliduje a místo něj se pak získá nový jen když je potřeba. Takže ta cache linků se můze hodit nejen pro dostažení, ale i po smazání staženého souboru. Je to maličký soubor. Po skončení stahování se záměrně nemaže. A když je tam plný počet platných linků Tor a spol. se už nespouští a jede se ihned plnou rychlostí což je pak u vekých souborů (10ky GB) ještě 3x rychlejší než znovu louskání nedostažených linků.

Ano, přejmenoval jsem to. Chtěl jsem to mít taky na pipy.org pro snadnou instalaci. Spouštěcí skript je tedy uld.py. To lze samozřejmě klidně vrátit zpět. Vypadlo to spíš že to zde pokračovat nebude. Mě se ale ten krátký název pro spouštění moc líbí, je to napsané hned :)

Změna velikosti bufferu ukládání a stahování (const.OUTFILE_WRITE_BUF a const.DOWN_CHUNK_SIZE) byla změněna na 20kb místo 1kb. A zlepšilo to zátěž při 100 segmentovém stahování.

Tflite model jsem zabalil přímo do whl balíčku. Vadilo mi jak se mi furt všude stahuje do CWD. Ano je to ted dost velký balíček, přišlo mi to praktické. Lze samozřejmě vrátit spět stahovací kód. Šlo mi taky o trochu konzistence. Stahování se vyhodnotí a když je Fast, TOR se nespouští při zachování zvoleného počtu segmentů. Fast linky na jeden segment jsou prostě pomalé a dobře posloužily při vývoji SegFileWriter SegFileLoader a SegFileMonitor. Tor se klidně spustí i uprostřed stahování (jen když je potřeba), ve statusu se oběví průběh spouštění TORu a poté co se vzalo 50 linků z cache a už jedou, se louskají další. Ty co se dostahují putují zpět do fromty jako dříve.

Změn je hodně a doufám, že se v tom půjde vyznat... Nejsem žádný velký pythonista. Je to pro mne jen jazyk == prostředek. Už jsem v něm nepsal mnoho let.. Myslím, že to snad alespoň funguje. Denně to používám. A tak jsem se nemohl nepodělit. Bylo by super spravit volání podprocesů na windows (aby se správně picklily ..) a fungovalo to.. Ale na ten OS nemám fakt nervy (18 let ho nepoužívám mimo virtuální stroje).

Takže to teď nechávám být (to co mám na gitlabu považuji za dokončené a zde je to ručně zrcadlené). Když to bude k užitku budu rád.

Mám teď rozdělaný kód v go a ten místo [7mi minut / 100 linků] jede [20 - 30 sekund / 100 linků] Ale dělá to pořád to samé. Jen rychleji a levněji. A možná přijde i GUI.. Ta neuronka je fakt super :), bez ní by to samozřejmě smysluplný nebylo.

@setnicka
Copy link
Owner

Prošel jsem si pořádně kód a commity a jsem pro to mergnout.

Cestou jsem ale potkal pár věcí, které stály za to opravit nebo udělat trošku jinak. Nejrychlejší mi přišlo změny ammendnout do správných commitů, některé squashnout a podobně. Proto teď udělám merge přes dočasnou větev vladodriver-review.

  • Minimální verzi Pythonu v setup.py jsem změnil na Python 3.7, aby stále platilo, že to lze spustit na Debian stable.
  • Přemýšlel jsem co s Wheelem pro tflite_runtime pro Python 3.9. Ten co je v repu bohužel nefunguje na systémech co mají GLIBC starší než 2.33. Nakonec jsem ho tam nechal, protože by někomu mohl pomoci, a přidal odkaz na postup jak si pořídit jiné. Ale stejně nejlepší bude, až vyjde pro Python 3.9 s oficiální podporou.
  • Entry point i samotný název projektu nechávám na ulozto-downloader, ale předělal jsem, jak fungují entrypointy v setup.py - teď je tam registrovaný ulozto-downloader i uld.
  • Na pár místech jsem nepřevzal až pedantské lámání na 80 znaků, protože to na těch místech IMHO ztěžovalo čitelnost kódu.

Díky za spoustu práce, je to dost dobré :)

@setnicka setnicka changed the base branch from master to vladodriver-review May 22, 2021 16:39
@setnicka setnicka merged commit 165e3a3 into setnicka:vladodriver-review May 22, 2021
@JanPokorny
Copy link

A ani Vzum to rovnou do souboru nemá, takže jsme zase o krok před nimi .. :)

Are you challenging me?

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants