Ha fájlt olvasok be és egy 1 GB-os pufferbe olvasok be, ettől kiakadhat a program? (Pascal)
Mármint attól, hogy ilyen nagy a puffer, az OS nem úgy adja neki a memóriát ahogy a program szeretné (ehhez nem értek), nem ad ki annyit, esetleg nincs annyi RAM az adott gépben... Nem lehet azt megoldani, hogy annyi RAM-ot foglaljon le (vagy annak a felét) amennyi adott gépben van?
Ez a teszt program amelyben egy 1 GB-s tömböt hoztam létre, nem akad ki elvileg...
Bár a gép nagyon belassul, az biztos, pedig 3 GB RAM van benne...
Meg lehet oldani a feladatot úgy, hogy dinamikus tömb és biztonságosan, automatikusan annyit foglaljon le, amit biztos hogy az OS aktuálisan ki tud neki adni?
program fajlmasol;
const
meret = 1073741824;
var
inf, outf : File of Byte;
adat : Array[1..meret] of Byte;
NumRead, NumWritten:Longint;
Begin
Assign(inf,ParamStr(1));
Reset(Inf);
Assign(outf,Paramstr(2));
Rewrite(outf);
Repeat
BlockRead(inf,adat,Sizeof(adat),NumRead);
BlockWrite(outf,adat,NumRead,NumWritten);
Until(NumRead=0);
Close(inf);
Close(outf);
End.
Egyáltalán nem mindegy a blokkméret. Ha helyesen lövöd be, akkor 3-4x sebességnövekedés simán el lehet érni.
Az optimális blokkméret viszont sok mindennek a függvénye: merevlemez, fájlméret, partíció, operációs rendszer, töredezettség méretéke, cache mérete, stb.
Legegyszerűbb ha leteszteled például a dd paranccsal. 4MB-8MB körülire szokták belőni a blokkméretet, körülbelül ott van az optimum, modernebb rendszereknél nagyobb is lehet. Írtam gyorsan egy Python programot hogy megnézzem windowson mennyi az optimális blokkméret, 500MB fájl mellett 16MB blokkméret volt a nyerő, 100-500MB közötti fájloknál 4MB körül, és 100MB alatti fájloknál ~1MB (még kilóbájtos tartományban is).
Minden esetben nagyobb blokkméret csak kis sebességcsökkenést eredményezett ha nem vittem túlzásba, viszont 4KB-os blokkméret amit fentebb többen is ajánlottak 4-5x volt lassabb mint az optimális. (1KB-nál ez az arány pedig még nagyobb volt).
Köszönöm a válaszokat, le fogom tesztelni a sebességet.
8 MB cache-vel rendelkezik a merevlemez és az a tervzem, hogy 64 KB clusterméretre formázom, hogy jobb legyen a teljesítmény, mintha 4K lenne csak.
A gyártó oldalán ezt is írják, ezért is vagyok bizonytalan hogy mire is célszerű állítani a puffert:
The 500GB Scorpio Blue’s straight line performance with sequential 2MB block transfers leads in its class, with transfer speeds of 117 MB/s reading and
writing. Note the drop-off in speed between the 500GB Scorpio Blue and its older 640GB sibling.
Nekem az 500 GB-s van.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!