File Reading

6 отговора 252 прегледа
#1

File Reading

Kak spored vas e nai-dobre da 4eta i obrabotvam danni ot file s razmer okolo 4 Mb
kato skorostta e nai-vajniq kriterii ?
Zada4ata mi e po skoro matemati4eska - algorituma go izmilih i e dosta burz
zatova mi trqbva vuzmojno nai-burziq na4in za obrabotka na vhodq6tite danni.
V momenta se dvoumq mejdu filemapping ili 4rez zadelqne na bufer i zarejdane na
celiq file v pametta. Purviq ne sum go izpolzval samo 4etoh malko teoriq za
nego no puk i nqmam mnogo info za tozi metod.
Daite nqkakva nasoka i da hodq da se rovq iz knigite ?

Отговор
в отговор на Beginner #2

Re: File Reading

Ами въпрос на експерименти е, батка. Зависи дали имаш последователно или рандом четене, зависи от бързината на самия диск и други такива. Принципно, първото, което се набива в главата е да изчетеш наведнъж целия файл и после да си работиш с буфера. Обаче още веднъж казвам - трябва експериментално да се провери.

Отговор
в отговор на Beginner #3

Re: File Reading

Ako mozesh da zaredish celia file v pametta e nai-barzo, no ako file-a e 4G ste e trudno, taka che dai malko poveche informacia. Kakav file, kolko goliam kak se access-vat elementite posledovatelno ili random (hodi se napred nazad).

Отговор
в отговор на dummy #4

Re: File Reading

Изобщо не е гаранция, че ще е най-бързо, особено ако има последователно изчитане.

Отговор
в отговор на Resurrector #5

Re: File Reading

Tova pak kakvo beshe? Ne iskam da sporia.
Kazah zavisi ot tova kolko pamet ima sistemata i kolko e goliam file-a. S 1G RAM i 2MB file sam ubeden che nai-barzo e ako go natovarish v apmetta. Po-barzo ot memory mapping ili ot read v buffer po 4K naprimer. Ne mislish li? Vsastnost ako bufer-a e 2M proizvoditelnostta ste e sastata :)

Отговор
в отговор на dummy #6

Re: File Reading

Faila e 4-5 Mb i se 4ete posledovatelno.
Neobhodimo e da se pro4ete cqlata info ot nego i da se opredelqt
na4aloto i duljinata na klu4ovi oblasti danni ot faila kato
pozicii v pametta i tova da stane predi da zapo4nat kalkulaciite.

Ako samo zaredq faila v pametta sled tova 6te trqbva pak da go obhodq za
da fiksiram parametrite za koito spomenah.

Iskam da gi opredelq po vreme na zarejdaneto na faila v pametta.

Sled tova algorituma izvur6va mnogo kominacii s dannite ot faila koito
ve4e trqbva da sa v pametta.Taka 4e te sa mi neobhodimi prez cqloto
vreme na rabota na programata.

Отговор
в отговор на Beginner #7

Re: File Reading

Moeto predlozenie e zaredi file-a v pametta celia. 4-5M sa nisto za savremennite computri. Oste poveche che taka ili inache ste ti triabvat. Kakva e prichinata za tova. Vsiako chetene/pisane ot/vav file vsastnost e prevkluchvane v kernel mode, chetene ot file-a v kernel memory. Sled tova OS kopira dannite ot kernel v User memory (v tvoiata zadelena pamet) i chak sled tova se vrasta v programata ti. Iasno ti e che cheteneto na 5M po 1K ste predizvika priblizitelno 5000 takiva operacii koeto si e skapo. Vsastnost e trudno da nakarash system-ata da chete 1K tia chete minimum 4K (1 page). Koeto oznachava che vsastnost ste napravish 3 prevkluchvania kernel-user mode samo za da kopirash pamet pamet. Zatova i bufer-a e zelatelno da e kratno na 4K. Pone niama da prevkluchvash kernel-user za da kopirash 1K. Nai-visoka proizvoditelnost bi postignal ako znaesh kolko e goliam cache-a za tvoia file (nesto koeto az lichno ne znam kak moze da se razbere) i da napravish bufer sas sastia razmer. Togava broia na prevkluchvaniata user-kernel-user ste sa minimalni. Ako bufer-a ti e po-goliam a pametta ti ne e dostatachno ste se sluchi slednoto: Ste se opita da zaredi ot file-a blok s razmera koito si mu zadal, no poneze niama dostatachno pamet ste zapochne da swap-va bufer-a ti. Sled koeto Performance-a ti otiva na vitara :)
Taka vsichko koeto napisah do tuk se otnasia za NT (i povecheto UNIX sistemi). Na Win95/98 nestata sa po-ralichni.

Ako ti se igrae i iskash real performance mozesh da napravish slednoto:
1. Otvairaish file-a sas slednite flagove: FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH
2. Zadeliash buffer sas slednata funkcia: buffer = VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE).
3. Izvikvash VirtualLock(buffer, size) Tova ti garantira che pametta zadelena za bufer nikoga niama da bade swap-nata na disk-a.
4. Pochvash da chetesh na porcii ReadFile v tozi sluchai chete direktno v tvoiata pamet niama kopirane kernel user memory. I poneze ne se swap-va bufer-a cheteneto e mnogo barzo. A zabravih che size triabva da e kratno na 512 byte-a.
Tova e pochti kato da rabotish sas diska na nisko nivo, podobno na rabotata pod DOS.
Triabva da vnimavash s tova kolko pamet ste Lock-nesh pamet stava nonswapable. Zabraniavash na systemata da swapva stranicite.

Ot tuk na tataka ti si reshavash kakvo ste pozvash :)

Отговор