Citat:
filmil:
Četvrta mogućnost je da koristiš mogućnosti operativnog sistema i da mapiraš deo datoteke u memoriju. Šetanje po datoteci se onda svodi na šetanje po memoriji, a operativni sistem vodi računa da je ispravan deo datoteke u memoriji.
Tu opet postoji problem sa memorijom: adresni prostor procesa je ogranicen i na 32-bitnoj arhitekturi i modernim kernelima redovito iznosi 3GB. Dio toga je rezervirano za NULL pointer checking, dio potrose DLL-ovi, dio potrosi program i tako..
Za mapiranje cijelog fajla u memoriju mora biti slobodno onolika kolicina UZASTOPNE (ne fragmentirane) virturalne memorije koliko je velicina fajla. Ako nemas dovoljno, opet ti ne pomaze.
Problem se moze rijesiti mapiranjem malih chunkova fajla pocevsi od nekog offseta, ali to opet komplicira stvar.
Uostalom, rijetko koji algoritam zahtijeva slucajan pristup bilo kojem bajtu datoteke. Ako ti nije bitna brzina napravi wrapper klasu za fajlove, npr:
Code:
class Indexedfile {
FILE *fp;
public:
IndexedFile(const char *fname);
unsigned char operator[](unsigned int off) const;
};
unsigned char IndexedFile::operator[](unsigned int off) const
{
if(fseek(fp, off, SEEK_SET) != EOF) {
int ch = fgetc(fp);
if(ch != EOF) return ch;
}
/* greska - izvan granica fajla ili pri citanju znaka */
}
Mozes dodati dodatni kod unutar klase koji cache-ira lookupove.. npr. std::map sa offseta na vrijednost, a mapa nikad nema vise od npr. 128 tisuca elemenata..
Ako ti treba i pisanje po fajlu, mozes napraviti operator[] koji vraca neku Proxy klasu.. Proxy klasa ima operator konverzije na unsigned char i overloada operator= koji onda zapisuje promijenjeni bajt u datoteku..
Uglavnom, sa ovakvim pristupom mozes napraviti trade-off brzina/potrosnja memorije kakav ti vec treba...