C# Random Data File Generator

C# Random Data File Generator

Příspěvekod Wlezley » 22 duben 2012 10:05:37

Tento program jsem již psal v jazyce C++ a najdete ho v sekci C/C++. Šlo to přepsat celkem rychle, až jsem se tomu sám divil, jak je C# (.NET) jednoduchý. :thumbup:

Jedná se o generátor náhodných dat, ukládaných do souboru. Na začátku programu si uživatel zvolí požadovanou velikost souboru v bajtech.
Program obsahuje výpis stavu procesu na obrazovku v procentech a bajtech. Obnovování výpisu stavu se děje každou sekundu.

Obrázek

V programu je pro uložení velikosti souboru použitý typ ulong (teoretická maximální velikost souboru: 18 446 744 073 709 551 615 b = ((1024^6)*16)-1 ).

Zdrojový kód programu:
http://paste.wlezley.eu/index.php/view/61888059

DOWNLOAD (bin for windows):
WO-Random_Data_File_Generator_BIN(dotNET).zip
Requires .NET Framework 3.5
(49.12 KiB) 917 krát
Uživatelský avatar
Wlezley
 
Příspěvky: 316
Registrován: 24 září 2011 22:54:46
Bydliště: Plzeň
Projekt: Wlezley EU

Re: C# Random Data File Generator

Příspěvekod Ariczek » 28 červen 2012 12:26:36

Jako ukázka dobrý, jako procvičení programování taky dobrý.

Pokud bys to ale chtěl někde použít reálně - třeba půl TB soubor... je potřeba to zrychlit :)

IO operace nad soubory jsou děsně pomalý - takže je blbost zapisovat to po bytech :) lepší je mít nějakej vnitřní buffer - třeba 5KB - ten si naplnit tím generátorem a až pak to zapsat do souboru. Případně to napsat vícevláknově - jedno vlákno generuje, hází do fronty, druhý bere z fronty a zapisuje do souboru - zase s bufferem.

Dále volat rnd.Next() s tím že to osekáš na 1 byte... je taky zbytečně dlouhé. Next ti tušim umí vrátit i ulong - takže zredukuješ počet volání rnd.Next na 1/8.

Další věc - po každém bytu volat zjištění času jestli už neuběhla sekunda je taky časově náročný :) lepší máš aktualizovat výpis po určitém počtu kroků - konstatntním, než po čase :) třeba pomocí operace modulo - (i%256 == 0) - odseknout posledních 8 bitů, a porovnat na 0 je mnohem rychlejší než volat system call na zjištění aktuálního času.
Ariczek
 
Příspěvky: 51
Registrován: 21 říjen 2011 10:54:52

Re: C# Random Data File Generator

Příspěvekod Wlezley » 02 červenec 2012 10:37:56

Dobrá poznámka. Díky.

Vím že to není nejrychlejší. Toto je pouze funkční příklad toho, jak by to asi mohlo vypadat (asi jako neošetřená PHP aplikace, která čte data z POST html formulářů a ukládá je do MySQL). Jen podotýkám, že 1GB soubor máš do dvou minut. On se totiž do souboru nezapíše každý jeden bajt, ono to taky vlastní buffery, který ale určuje systém (ovladač daného úložiště, etc..). Vyzkoušej si to. :P

rnd.Next()... tam je velikostně jeden bajt.. jasně, dalo by se z toho vyždímat maximum a rozřezat to, jenže tak je jeen problém. Jsem zvědaný, jestli na to přijdeš. :P

Tikání je dost krkolomný, to přiznávám. Nejlepší řešení který mě (ve Windows) napadá, je napsat virtuální process callbacků po vzoru multi-smyček progressbarů. :shutup:

Ale zajímalo by mě to tvoje řešení. :) Klidně něco sepiš, až budeš mít čas. Rád se na to podívám. :)

PS: Pamatuj. Těch pár nanosekund na jedný smyčce to nezachrání. ;) :flex:
Uživatelský avatar
Wlezley
 
Příspěvky: 316
Registrován: 24 září 2011 22:54:46
Bydliště: Plzeň
Projekt: Wlezley EU

Re: C# Random Data File Generator

Příspěvekod Ariczek » 03 červenec 2012 13:59:21

no, já bych to spíš napsal v javě :) v C# jsem začátečník :) psal jsem spíš obecně co mě napadlo a platí to všude - C++, java, PHP, C# :)

pokud C# na týhle úrovni sám řeší bufferování IO operací :) všude jinde si to programátor řeší sám, nebo řekne explicitně použij bufferování.

i těch pár nanosekund je úspěch :) pamatuj - záleží na velikosti instance :) ušetřit 10% z 2 minut při 1GB instanci, nebo ušetřit 10% při instanci tisíce či miliony TB ? :D

třeba jsem kdysi psal multi-počítačovou (distribuaovanou) aplikačku, kde každej comp dělal kus výpočtu. Jednalo se o optimalizační problém s prohledáváním stavovýho prostoru... docházelo tam k ořezávání prostoru - pokud některej comp našel dobrý řešení - rozeslal hodnotu řešení všem ostatním - aby si každej comp moh zmenšit stavovej prostor.
A tam jsem právě řešil - že příjem po síti, nebo kontrola jestli něco přišlo je podstatně pomalejší než propočítání dalších stavů :) Takže bylo ve finále rychlejší kontrolovat síť jednou na 200 iterací, než pokaždý :)
Ariczek
 
Příspěvky: 51
Registrován: 21 říjen 2011 10:54:52

Re: C# Random Data File Generator

Příspěvekod Wlezley » 04 červenec 2012 07:45:16

Víš, ale tady řešit rychlost a krkolomný optimalizace asi nemá smysl. Kdybych to psal pro komerční účely, mělo by to smysl.

Šlo by na začátku vypočítat kolik iterací to provede za jednu sekundu a pak zobrazovat stav jednou za těch X iterací. Rozhodně ale neudělám blbost typu zobrazování stavu při každý iteraci. TO by totiž byla echt kravina. :D

Java mi smrdí, ale to by bylo na jinou diskuzi. Tohle jsem původně psal v C++ (zde) a přepis do C# je experimentální. Ale funguje to. :tongue_ss:
Uživatelský avatar
Wlezley
 
Příspěvky: 316
Registrován: 24 září 2011 22:54:46
Bydliště: Plzeň
Projekt: Wlezley EU

Re: C# Random Data File Generator

Příspěvekod Ariczek » 05 červenec 2012 00:29:19

Však jasný :) já se jen trochu zamyslel jak by to šlo vylepšit :P

no děláš tu blbost že při každé jedné iteraci zjišťuješ čas :) a btw. kolik iterací se stihne za sekundu není ani zdaleka konstanta ;) ale značně se to liší - třeba se OS probudil a něco dělá - sebere tomu programu procesorovej čas ;)

P.S. A tož klidně napiš nějaký téma proč ti java smrdí, rád si ho přečtu ;)
Ariczek
 
Příspěvky: 51
Registrován: 21 říjen 2011 10:54:52

Re: C# Random Data File Generator

Příspěvekod Wlezley » 05 červenec 2012 08:49:11

Hele, to byl příklad. :D Dalo by se to pochopitelně průměrovat tím stylem, že by se jednou za těch X iterací měřil rozdílový čas, třeba v řádech milisekund, přičemž by se hodnota X upravovala. Bylo by to efektivnějši. Lze na to vymyslet relativně jednoduchý vzorec.

Nerad bych tam cpal konstantu na počet iterací, po kterých by se výpis zobrazil a to z jednoho prostého důvodu. Každý počítač, každá sestava, každý systém, etc... má jinou rychlost. U některých se to liší neznatelně, u jiných je ten rozdíl nápadnější. To ale zmiňuji jen okrajově, abych uvedl na pravou míru problematiku, o které se zde bavíme. Proto tu vymýšlím průměrování a podobné prkotiny. :P

Hele, já si z Javy utahuju jenom proto, protože k tomu jazyku (zatím) nemám žádný vztah. Bylo by super a bych bych ti nesmírně vděčný, kdybys něco začal vyučovat v tý kategorii co tu je. Minimálně já to číst budu. :D Ještě by to ale chtělo dotáhnout pár slušných lidiček.. :) Mě to tu samotnýho nebaví. :(
Uživatelský avatar
Wlezley
 
Příspěvky: 316
Registrován: 24 září 2011 22:54:46
Bydliště: Plzeň
Projekt: Wlezley EU

Re: C# Random Data File Generator

Příspěvekod Ariczek » 05 červenec 2012 23:52:24

Tož to je jasný :) že spamovat si to tu sám pro sebe nebaví :P trochu propagace, PR, reklamy, oni se lidi najdou :)

ja bych pokracoval klidne, ale je mi blby delat v ty jave triplepost, prave proto ze to asi pisu sam pro sebe :P
zkusim tam preklopit (a vylepsit) tenhle tvuj generator :D protoze mi to prijde jako skoro stejny :D

ja jako javista zase znam ten for, ze M$ premejslel ze udela novej programovaci jazyk - tak vzal javu, par veci zmenil a je z toho C# :D protoze je to v podstate stejny ;)
Ariczek
 
Příspěvky: 51
Registrován: 21 říjen 2011 10:54:52

Re: C# Random Data File Generator

Příspěvekod Wlezley » 07 červenec 2012 12:47:11

No já jsem spíš céčkař (++), ale né sharpista, ani javista. :D Sory za anglizmy, ale prostě ... mě baví to C++ víc. Pochopitelně to céčko nepůjde použít uplně na všechno, jsou jazyky s mnohem větší využitelností a přenositelností co do platformy a operačního systému. Myslím že java je celkem pružná, tuhle otázku ale nechám pro ty zkušenější z nás. Já nevím, jazyků je spousta, určitě mají výhody a nevýhody; hranice a omezení... :)

C# ve Windows je navíc dost blbej z hlediska toho, že jde v podstatě o ten jejich blbej dotNET. Nedovedu si to představit na linuxu, nikdy jsem to na něm neviděl ani jsem na linuxu v něm neprogramoval. Podle mýho soukromýho názoru (který jsem si utvořil z nespočtu článků kde javu kdosi vychvaloval až do nebes) si myslím, že java je daleko pružnější. :pokey:
Uživatelský avatar
Wlezley
 
Příspěvky: 316
Registrován: 24 září 2011 22:54:46
Bydliště: Plzeň
Projekt: Wlezley EU


Zpět na C# (C sharp)

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník


cron