280 likes | 446 Views
3. Razpršene datoteke. Zapisi so urejeni po vrednosti ključa. l ego zapisa določa razpršilna funkcija r: K (ljuč) -> N (aslov zapisa) razpršilna funkcija priredi zapisu na osnovi njegovega ključa k naslov polja ali skupine polj n, v katero se zapis shrani
E N D
3. Razpršene datoteke • Zapisi so urejeni po vrednosti ključa. • lego zapisa določarazpršilna funkcija r: K(ljuč) -> N(aslov zapisa) • razpršilna funkcija priredi zapisu na osnovi njegovega ključa k naslov polja ali skupine polj n, v katero se zapis shrani • ker je pričakovano število zapisov v datoteki praviloma veliko manjše od števila možnih vrednosti ključa, je naloga funkcije r čim enakomernejša porazdelitev vrednosti ključev zapisov preko naslovnega področja
3. Razpršene (hash) datoteke • zapisi so urejeni po vrednosti ključa. • lego zapisa določarazpršilna funkcija Ak=razpršilna_funkcija(KljučK) • razpršilna funkcija priredi zapisu na osnovi njegovega ključa K naslov polja (ali skupine polj) Ak, v katero se zapis shrani K Statično razprševanje – število blokov je fiksno Ostali podatki zapisa Razpršilna funkcija
Variante razprševanja • Razpršilna funkcija takoj izračuna naslov fizičnega bloka v katerem so podatki // slika na prejšnji prosojnici • Primerno za primarni indeks • Razpršilna funkcija izračuna naslov bloka v katerem se nahaja kazalec na blok s podatki // slika • Primerno za sekundarne indekse K Razpršilna funkcija Ostali podatki zapisa Indeks
Prednosti in težave z razprševanjem • Iskanje je zelo hitro (ko izračunaš vrednost razpršilne funkcije dobiš naslov bloka in ga le prebereš z diska za dostop do podatka potrebujemo le en dostop do diska) • Težko definirati dobro razpršilno funkcijo • Prihaja do kolizij (več kandidatov za enak naslov) • Prihaja do pretirane porabe prostora (datoteka ima veliko ‘lukenj’) • Ni primerno za zaporedno obdelavo podatkov
Primer razpršilne funkcije • ključ = ‘x1 x2 … xn’ //niz n znakov • Imamo b fizičnih blokov • h = (x1 + x2 + … + xn) mod b {0, 1, …, b-1} • Kdaj bo predlagana rapršilna funkcija primerna? • če je razmerje med pričakovanim številom ključev / fizični blok približno enako za vse fizične bloke
d a e c b Primer (težav) pri dodajanju zapisov • Fizični blok ima 2 zapisa 0 1 2 3 DODAJ: a,b,c,d h(a) = 1 h(b) = 2 h(c) = 1 h(d) = 0 DODAJ: e h(e) = 1kolizija!!!!
? Primer (težav) pri brisanju zapisov Briši:ef 0 1 2 3 a • Izkoristek prostora = • število uporabljenih ključev / maximalna zapolnjenost blokov • Naj bo med 50% in 80% • Če je < 50% pretirana izguba prostora • Če je >80% uporaba prelivnega področja je močno odvisna od kakovosti razpršilne funkcije in od številka ključev v bloku b d c d c e f g
Ukrepi pri odpravljanju težav z naraščanjem velikosti datotek z razpršeno datotečno organizacijo • Uporabljamo prelivna področja in po potrebi izvajamo reorganizacije • Uporabljamo dinamično razprševanje – število fizičnih blokov se lahko spreminja • Razširljivo // uporabimo le i bitov vrednosti razpršilne funkcije, i se s časom povečuje ali uporabi direktorij kazalcev na fizične bloke (v direktoriju je 2i kazalcev) • Linearno // število fiz. blokov se povečuje za 1 • …
Extensible • Linear • also others ... How do we cope with growth? • Overflows and reorganizations • Dynamic hashing: # of buckets may vary
Extensible hashing: two ideas (a) Use i of b bits output by hash function b h(K) use i grows over time…. For example, b=32 00110101
(b) Use directory h(K)[i ] to bucket . . . . . . Directory contains 2i pointers to buckets, and stores i. Each bucket stores j, indicating #bits used for placing the records in this block (j i)
Extensible Hashing: Insertion • If there's room in bucket h(k)[i], place record there; Otherwise … • If j=i, set i=i+1 and double the directory • If j<i, split the block in two, distribute records among them now using j+1 bits of h(k); (Repeat until some records end up in the new bucket); Update pointers of bucket array • See the next example
i = 2 00 01 10 11 1 1 2 1010 New directory 2 1100 Example: h(k) is 4 bits; 2 keys/block (j) 1 0001 i = 1 1001 1100 Insert 1010
2 0000 0001 2 0111 2 2 Example continued i = 2 00 01 10 11 1 0001 0111 1001 1010 Insert: 0111 0000 1100
i = 3 000 001 010 011 100 101 110 111 3 1001 1001 2 1001 1010 3 1010 1100 2 Example continued 0000 2 0001 i = 2 00 01 10 11 0111 2 Insert: 1001
Extensible hashing: deletion • Reverse insert procedure … • Example: Walk thru insert example in reverse!
Indirection (Not bad if directory in memory) Directory doubles in size (First it fits in memory, then it does not -> sudden performance degradation) - - Summary Extensible hashing + Can handle growing files - without full reorganizations Only one data block examined +
Two ideas: b (a) Use ilow order bits of hash 01110101 grows i (b) File grows linearly Linear hashing: grow # of buckets by one -> No bucket directory needed
Linear Hashing: Parameters • n: number of buckets in use • buckets numbered 0…n-1 • i: number of bits of h(k) used to address buckets • r: number of records in hash table • ratio r/n limited to fit an avg bucket in a block • next example: r 1.7n, and block holds 2 records=> AVG bucket occupancy is 1.7/2 = 0.85 of a block
If h(k)[i ] = (a1 … ai)2< n, then look at bucket h(k)[i ]; else look at bucket h(k)[i ]- 2i -1 = (0a2 … ai)2 Rule Example:2 keys/block, b=4 bits, n=2, i =1 • insert 0101 00 01 • now r=4 >1.7n -> get new bucket 10and distribute keys btw buckets 00 and 10 0000 0101 1010 1111
1010 -> n=3, i =2; distribute keys btw buckets 00 and 10: 000110 0000 0101 1010 1111
0001 n=3, i =2; insert 0001: • can have overflow chains! 000110 0000 0101 1010 1111
n=3, i =2 0001 • insert 0111 0111 000110 • bucket 11 not in use-> redirect to 01 0000 0101 1010 1111 • now r=6 > 1.7n-> get new bucket 11
1111 0111 0001 n=4, i =2; distribute keys btw 01 and 11 0001 0111 00011011 0000 0101 1010 1111
3 0101 0101 101 100 0 0 0 0 101 110 111 100 101 Example Continued:How to grow beyond this? i = 2 00 01 10 11 0000 0101 1010 1111 0101 . . . m = 11 (max used block)
Summary Linear Hashing + Can handle growing files - without full reorganizations No indirection directory of extensible hashing Can have overflow chains - but probability of long chains can be kept low by controlling the r/n fill ratio (?) + -
Summary Hashing - How it works - Dynamic hashing - Extensible - Linear
Next: • Indexing vs Hashing • Index definition in SQL