Čtení a parsování textového souboru

jpu

Re:Čtení a parsování textového souboru
« Odpověď #30 kdy: 05. 08. 2017, 21:34:16 »
Kite, cez vikendy urcite nerobim na praci, ktora sa tyka firmy. Taky workoholik nie som :D


Kit

Re:Čtení a parsování textového souboru
« Odpověď #31 kdy: 05. 08. 2017, 22:12:09 »
Kite, cez vikendy urcite nerobim na praci, ktora sa tyka firmy. Taky workoholik nie som :D

2.8. byla středa.

jpu

Re:Čtení a parsování textového souboru
« Odpověď #32 kdy: 17. 08. 2017, 15:05:28 »
Tak som to skusil pomerat a vyslo mi, ze najrychlejsie precitanie a spracovanie jednotlivych riadkov, je rychlejsie sekvencne ako paralelne. Skusal som pouzit Paralle.Foreach a v nom musim pouzivat ConcurrentDirectory, nakolko potrebujem vyuzivat takyto datovy typ a ConcurrentDirectory je pomalejsi oproti normalnemu Directory.
Normalnym foreachom a obycajnym Directory som sa dostal na cas 1:29min a pomocou Parallel.Foreach + ConcurrentDirectory som sa dostal na 1:38min.
Mozno by sa to dalo este nejako urychlit, ale neviem ci to ma zmysel, mozno pojde radovo o milisekundy. Kazdopadne dakujem Vam za rady.

mikrom

Re:Čtení a parsování textového souboru
« Odpověď #33 kdy: 17. 08. 2017, 23:15:29 »
Povedzme ze mam vycitat vsetkych uzivatelov, ktori boli zadani na vstupe a potom k danym uzivatelom priradit veci, ktore sa ich tykaju.
...
Horsie je to s vyhladavanim, to uz zaberie dlhsi cas, nakolko kazdy riadok sa musi porovnat voci trom regularnym vyrazom.

Ja by som si pri jednom precitani suboru vytvoril hash, napr. kde kluce by boli uzivatelia a hodnoty by boli zoznamy veci, ktore sa ich tykaju, t.j.:

aktivity_uzivatelov = {
  user1 => [vec11, vec12, ..., vec1m]
  user2 => [vec21, vec22, ..., vec2n]
  ...
}
a potom by som prehladaval podla kriterii tento hash.

Pouzivam windows a robim to v C#. To na doplnenie :)
Tak teda uprimnu sustrast. Na taketo veci sa pouziva perl alebo python a mozno by uplne postacilo aj awk 8)

jpu

Re:Čtení a parsování textového souboru
« Odpověď #34 kdy: 18. 08. 2017, 11:24:29 »
Tiez mi napadlo awk, na skole sme s tym robili pod linuxami, ale windows myslim nieco take nema


mikrom

Re:Čtení a parsování textového souboru
« Odpověď #35 kdy: 18. 08. 2017, 13:57:16 »
Tiez mi napadlo awk, na skole sme s tym robili pod linuxami, ale windows myslim nieco take nema
Existuje awk skompilovane aj pre Windows, napr:
https://sourceforge.net/projects/gnuwin32/files/gawk/3.1.6-1/
alebo si nainstaluj MinGW-MSYS
http://www.mingw.org/wiki/msys
a tam mas vsetky bezne utility - zrejme aj novsia verzia awk

Re:Čtení a parsování textového souboru
« Odpověď #36 kdy: 18. 08. 2017, 14:40:35 »
Cygwin?
https://www.cygwin.com/

Všechny ty báječné cli utility pod woknousama...

Unknown

Re:Čtení a parsování textového souboru
« Odpověď #37 kdy: 18. 08. 2017, 14:46:42 »
Hodne unix utils byla portovano pod Win

http://gnuwin32.sourceforge.net/packages.html

Unknown

Re:Čtení a parsování textového souboru
« Odpověď #38 kdy: 18. 08. 2017, 14:47:53 »

JS

Re:Čtení a parsování textového souboru
« Odpověď #39 kdy: 18. 08. 2017, 16:14:04 »
IMHO, 3GB jsou nic, to schroustas ani nemrknes. Aplikovat na kazdy radek 3 regularni vyrazy, to by melo byt par vterin. (IMHO, pokud ten kompilator regularnich vyrazu umi trochu optimalizovat, a pokud jsou to podobne vyrazy, a jsou konstantni, tak by mohlo pomoci jejich slouceni do jednoho. Bohuzel u regexpu se to dela obecne blbe. To je v podstate ekvivalent tomu napsat si vlastni automat, jak tu nekdo navrhoval.)

Paralelizaci na takhle malo dat skoro ani nema smysl resit. Nez to rozchodis a ujistis se, ze to opravdu paralelizuje, tak to budes mit 100x spocitane.

JS

Re:Čtení a parsování textového souboru
« Odpověď #40 kdy: 18. 08. 2017, 16:20:17 »
Jo, a jeste - nejdriv bych zkusil neco jako prikaz time v Linuxu - zjistit, kolik casu CPU a realneho to sezralo. Pokud to sezralo vyrazne vic realneho nez CPU casu, pak to znamena, ze CPU se nudil, tudiz cela ta uloha je IO-bound a paralelizaci vubec nema smysl resit.

Re:Čtení a parsování textového souboru
« Odpověď #41 kdy: 19. 08. 2017, 02:23:51 »
Je kouzelné sledovat tady diskuse o tom, jak je paralelizace náročná, že je to potřeba testovat atd... Přitom stačí použít odpovídající nástroj.

Vezmu Go, vstupní procedura čte soubor po řádcích a ty posílá na vstupní channel. Odhad cca 15-20 řádků i s ošetřením chyb. Samotná výkonná funkce čte v nekonečné smyčce řádky ze vstupního kanálu, provede ty 3 regulární výrazy a pokud to projde, data vytiskne nebo je pošle na výstupní channel. (Odhad dalších 15-20 řádků.) Na výstupní channel je připojena procedura která vyselektovaná data zpracuje. Main spustí ve smyčce paralelně 100x (nebo třeba 1000x) výkonnou proceduru, a paralelně spustí čtení souboru. (Odhad tak 25-30 řádků včetně všech deklarací a serepetiček okolo.) Celé to bude zhruba tak rychlé, jako přečtení toho souboru. Není potřeba nic testovat (ale kdybyste chtěl, benchmarking je součástí standardní knihovny a je triviální), maximálně tak vyzkoušet kolikanásobná paralelizace má ještě smysl.

Takže se bavíme o programu délky cca 70 řádků a jedná se o elementární pattern (pipeline => fan out - process - fan in). Za tu dobu co tady diskutujete to máte napsané, i když o Go nic nevíte. Navíc nepochybuji o tom, že v jiných jazycích včetně C# naleznete ekvivalentní prostředky, byť možná nebudou tak přímočaré a jednoduché k použití, jako u Go. Ale i kdyby měl ten Váš program 150 řádků, o čem se proboha bavíme? Jaké schválení potřebujete a kolik času si představujete, že budete potřebovat? A motat do toho ještě DB, jenom indexovování sežere spoustu času, a tady se jedná o jednorázový scan.

P.S.: U Go jako bonus zdarma dostanete multiplatformnost, takže vám to poběží ve Windows, *BSD, macOS i Linuxu, takže si můžete vybrat development platformu a na ostatní to kroskompilovat.

Re:Čtení a parsování textového souboru
« Odpověď #42 kdy: 27. 08. 2017, 04:21:49 »
Na moje pocudovanie som zistil, ze aplikovat regex na kazdy riadok nie je spravne, lebo to strasne dlho trva. Pouzit string.contains a az potom aplikovat regex je rychlejsie. Bol som v domneni, ze regex su rychlejsie. Kazdy sa ucime :)

Nemohl by si sem postnout ten kod, ktery aplikoval regex pro kazdy radek? Ze zvedavosti