• Aucun résultat trouvé

Transparents(PowerPoint

N/A
N/A
Protected

Academic year: 2022

Partager "Transparents(PowerPoint"

Copied!
94
0
0

Texte intégral

(1)

7 Gestion des données en mémoire secondaire

Données persistantes en mémoire secondaire

unité de disque

Organisation physique des données

façon dont les données sont structurées en mémoire secondaire

Méthode d'organisation des données

structure de données particulière utilisée pour

organiser les données en mémoire secondaire

(2)

27/02/22 © Robert Godin. Tous droits réservés 2

Critères d'évaluation des méthodes d'organisation

 Temps d'accès aux données par rapport à différentes méthodes d'accès

– sériel, sélection, ...

 Délai d'insertion et de suppression

 Occupation mémoire

(3)

Conception physique

 Choix des méthodes d ’organisation

– organisation sérielle

– organisation séquentielle

– indexage

– hachage

– organisation par grappe

– ...

 Schéma interne de la BD

(4)

27/02/22 © Robert Godin. Tous droits réservés 4

7.1 Principales caractéristiques des disques

Unité de disque (disk pack ) ou disque

P is t e

C y lin d r e

S e c t e u r

P la t e a u

T ê t e d e

le c t u r e / é c r it u r e

(5)

Capacité de Superbit

capacitéDisque = nbSurfaces nbCylindres nbSecteursParPiste  tailleSecteur

= 20 surfaces  1000 cylindres  50 secteurs par piste  512 octets

= 512,000,000 octets  500,000 kilooctets(K)  500 mégaoctets (M)

Paramètre Valeur

Nombre de surfaces ( nbSurfaces ) 20

Nombre de pistes par surface ( nbCylindres ) 1000

Nombre de secteurs par piste ( nbSecteursParPiste ) 50

Nombre d'octets de données par secteur ( tailleSecteur ) 512

(6)

27/02/22 © Robert Godin. Tous droits réservés 6

Transfert d ’un secteur

Secteur

unité d'adressage et de transfert minimal

Adresse physique de secteur

numéro de surface (noSurface), numéro de cylindre (noCylindre), numéro de secteur dans la piste

(noSecteur)

Adresse relative de secteur (noSecteurRelatif)

dans l'intervalle [0..n-1]

Tampon (buffer )

zone de la mémoire centrale où transitent les données de

la mémoire secondaire

(7)

7.1.1Modèle simple d'estimation du coût d'une entrée/sortie (transfert) sur disque

 Temps de transfert (entrée/sortie) de n octets

TempsESDisque(n) = TempsPosDébut + TempsTrans (n)

TempsPosDébut = TempsDépBras + TempsRotation (10ms)

TempsDépBras :

6-25 ms (6ms)

TempsRotation :

4,18 à 8,35 ms = 60 à 120 tours/sec (4ms)

TempsTrans(n) = n / TauxTransVrac

TauxTransVrac = NombreOctetsPiste / TempsRotationComplète (2M/sec)

ex: TempsTrans(2K) = 2K / 2M/sec = 1ms

ex: TempsESDisque(2K) = 10ms + 1ms = 11ms

Minimiser le nombre d'entrées/sorties en mémoire

secondaire

(8)

27/02/22 © Robert Godin. Tous droits réservés 8

Importance de la contiguïté physique

 Ex: transfert de 2000 secteurs de 512 octets (1M)

– Secteurs consécutifs

TempsESDisque(1M) = 10ms + 500ms = 510ms

– Secteurs dispersés aléatoirement

TempsESDisque(un secteur) = 10ms + 0,25ms = 10,25ms

Total = 2000  10,25 = 20 500 ms = 20,5 secs

 Effet de grappe (clustering)

regrouper physiquement selon patrons d ’accès

logiques

(9)

7.1.2 Contrôleur de disque

Contrôleur de disque (disk controller )

processeur simple et indépendant de l'unité centrale de traitement

DMA (« Direct Memory Access »)

 Interface du contrôleur :

type de transfert (lecture ou écriture)

adresse du premier secteur

nombre de secteurs à transférer

adresse du tampon

Normes pour PC

IDE/ATA, SCSI

(10)

27/02/22 © Robert Godin. Tous droits réservés 10

7.1.3 Autres types d'unité de mémoire secondaire

Type d'unité Temps de positionnement (ms)

Taux de

transfert en vrac (M/ sec)

Capacité

(M) Coût ($/ M) Particularité

Mémoire vive 10

-6

-10

-5

10

2

-10

3

0-10

4

10-10

2

Volatile

Disque 1-10 1-10

2

10-10

4

10

-1

-1 Non amovible

Disque

amovible 10-10

2

1 10-10

3

1-10

Disquette 10

2

10

-1

1 10

-1

Disque

Optique 10

2

10

-1

-1 10

2

-10

3

10

-2

-10

-1

Cédérom non

modifiable Bande

magnétique 10

6

1-10 10

2

-10

6

10

-3

-10

-2

Accès direct

prohibitif

Tableau comparatif des types de

mémoire

(11)

7.2 Fichiers et répertoires

Système de gestion de fichier (SGF, file system)

– abstraction des mémoires secondaires sous forme d'un ensemble de fichiers

Hiérarchie des répertoires (directory hierarchy) ou répertoire

– structure d ’arbre

dossier, catalogue

(12)

27/02/22 © Robert Godin. Tous droits réservés 12

Cas de UNIX

Chemin du fichier (“ file path ”)

– /usr/degas/travaux/fibonacci.cpp

u s r b in

/

d e v

m o n e t d e g a s

t r a v a u x

f ib o n a c c i f ib o n a c c i . c p p

c v . t x t

Volume racine

(13)

Descripteur de fichier (file descriptor )

 Ensemble d ’attributs du fichier

– Nom du fichier

– Type de fichier

– Propriétaire

– Date de création

– Date de dernière modification

– Paramètres de protection

– Taille actuelle

– Taille maximale

– Référence à la table d'allocation des fichiers

(14)

27/02/22 © Robert Godin. Tous droits réservés 14

Descripteur de répertoire

 Ensemble d ’attributs du répertoire

– Nom du répertoire

– Type de répertoire

– Propriétaire

– Date de création

– Paramètres de protection

– Taille

– Collection de références aux sous-répertoires

– Collection de références aux fichiers sous ce

répertoire

(15)

Unité de mémoire secondaire logique /physique

Partition du disque (disk partition)

– découper un disque en plusieurs partitions

– unité logique de mémoire secondaire

Descripteur de disque

– partitions, hiérarchie des répertoires et fichiers

– maintenu sur disque

(16)

27/02/22 © Robert Godin. Tous droits réservés 16

Services de base

Ouvrir (IN cheminFichier, OUT idInterne,…)

SGF crée une entrée dans la table des fichiers ouverts

idInterne : référence à la table des fichiers ouverts

mode d ’accès : lecture/écriture, accès

direct/séquentiel, création ou fichier existe déjà ,…

allocation d ’espace

exceptions

Fermer (IN idInterne, …)

libère l ’entrée de la table des fichiers ouverts

évacuer tampons

(17)

7.3 Organisation par bloc

 Fichier ~ tableau de blocs (taille variable)

LireBloc(IN idInterne, IN numéroBloc, OUT tamponApplication,…)

ÉcrireBloc(IN idInterne, IN numéroBloc, IN tamponApplication,…) 0

1 2

#bloc

(18)

27/02/22 © Robert Godin. Tous droits réservés 18

Bloc, page ou

enregistrement physique

 Ensemble de bits d'une taille fixe

– habituellement n secteurs (1, 2, 4, 8,…)

– traduction bloc => secteur

 Unité de base de transfert de données

 Unité minimale d'allocation d'espace

(19)

Allocation des secteurs aux blocs de Superbit

Allocation par cylindre pour minimiser déplacement du bras

noBloc noSecteurRelatif noPiste noSurface noSecteur

0 0-4 0 0 0-4

1 5-9 0 0 5-9

2 10-14 0 0 10-14

3 15-19 0 0 15-19

... ... ... ... ...

9 45-49 0 0 45-49

10 50-54 0 1 0-4

11 55-59 0 1 5-9

... ... ... ... ...

20 100-104 0 2 0-4

21 105-109 0 2 5-9

... ... ... ... ...

190 950-954 0 19 0-4

191 955-959 0 19 5-9

... ... ... ... ...

200 1000-1004 1 0 0-4

201 1005-1009 1 0 5-9

... ... ... ... ...

Paramètre Valeur

nbSurfaces 20

nbCylindres 1000

nbSecteursParPiste 50

tailleSecteur 512

nbSecteursParBloc 5

(20)

27/02/22 © Robert Godin. Tous droits réservés 20

Calcul d ’adresse relative du premier secteur d ’un bloc

noSecteurRelatif (105)

– = noBloc (21)  nbSecteursParBloc (5)

noBloc noSecteurRelatif noPiste noSurface noSecteur

0 0-4 0 0 0-4

1 5-9 0 0 5-9

2 10-14 0 0 10-14

3 15-19 0 0 15-19

... ... ... ... ...

9 45-49 0 0 45-49

10 50-54 0 1 0-4

11 55-59 0 1 5-9

... ... ... ... ...

20 100-104 0 2 0-4

21 105-109 0 2 5-9

... ... ... ... ...

190 950-954 0 19 0-4

191 955-959 0 19 5-9

... ... ... ... ...

200 1000-1004 1 0 0-4

201 1005-1009 1 0 5-9

... ... ... ... ...

Paramètre Valeur

nbSurfaces 20

nbCylindres 1000

nbSecteursParPiste 50

tailleSecteur 512

nbSecteursParBloc 5

(21)

Calcul de l ’adresse physique du premier secteur du bloc

noCylindre (0) = noSecteurRelatif (105) DIV nbSecteursParCylindre (1000)

où nbSecteursParCylindre (1000) = nbSecteursParPiste (50)  nbSurfaces (20)

noSurface (2) = (noSecteurRelatif (105) MOD nbSecteursParCylindre (1000)) DIV nbSecteursParPiste (50)

noSecteur (5) = (noSecteurRelatif (105) MOD nbSecteursParCylindre (1000)) MOD nbSecteursParPiste (50)

noBloc noSecteurRelatif noCylindre noSurface noSecteur

0 0-4 0 0 0-4

1 5-9 0 0 5-9

2 10-14 0 0 10-14

3 15-19 0 0 15-19

... ... ... ... ...

9 45-49 0 0 45-49

10 50-54 0 1 0-4

11 55-59 0 1 5-9

... ... ... ... ...

20 100-104 0 2 0-4

21 105-109 0 2 5-9

... ... ... ... ...

190 950-954 0 19 0-4

191 955-959 0 19 5-9

... ... ... ... ...

200 1000-1004 1 0 0-4

201 1005-1009 1 0 5-9

... ... ... ... ...

Paramètre Valeur

nbSurfaces 20

nbCylindres 1000

nbSecteursParPiste 50

tailleSecteur 512

nbSecteursParBloc 5

(22)

27/02/22 © Robert Godin. Tous droits réservés 22

7.3.1 Allocation d'espace contigu

Allocation en vrac à la création du fichier

Croissance de la taille du fichier ???

Fragmentation externe

F i c h i e r A F i c h i e r B F i c h i e r C F i c h i e r D

Mieuxajusté

F i c h i e r A F i c h i e r B F i c h i e r C F i c h i e r D

Premierajusté

(23)

7.3.2 Allocation dynamique d'espace par granule

Granule d'allocation d'espace (segment, cluster, extent)

unité d'allocation d'espace

ensemble de blocs consécutifs

Fragmentation du fichier (file fragmentation)

A B C

D A B B B C D B

A B C

D D A B B B B C

Défragmentation

(24)

27/02/22 © Robert Godin. Tous droits réservés 24

Table d'allocation des

fichiers (file allocation table - FAT)

B lo c 0 d u F i c h ie r A B lo c 1 d u F i c h ie r A B lo c 0 d u F i c h ie r B B lo c 1 d u F i c h ie r B

B l o c li b r e B l o c li b r e B lo c 5 d u F i c h ie r A B lo c 0 d u F i c h ie r C B lo c 1 d u F i c h ie r C

B l o c li b r e 1 0

1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 N u m é r o d e b lo c

d u d i s q u e

B lo c 2 d u F i c h ie r A B lo c 3 d u F i c h ie r A B lo c 4 d u F i c h ie r A B lo c 2 d u F i c h ie r B B lo c 3 d u F i c h ie r B 2 0

2 1 2 2 2 3 2 4

1 1

N o m d u f ic h i e r

N u m é r o d u p r e m i e r b l o c

A 1 0

B 1 2

C 1 7 2 0

1 3 2 3

N i l 1 0 N i l

2 1 2 2 1 6 2 4 N i l

D i s q u e o r g a n i s é p a r b l o c T a b l e d ' a l l o c a t i o n

d e s fic h i e r s

1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4

 Ex: granule = 1 bloc

 Style DOS

 Allocation d ’espace chaînée

 Chargée en mémoire centrale

(25)

Organisations plus

sophistiquées pour la table d ’allocation

 UNIX, NTFS

– structure arborescente

Stratégie des frères jumeaux (buddy system)

– granules d'allocation d'espace de taille 2

n

– fusion/division de granules voisins

(jumeaux)

(26)

27/02/22 © Robert Godin. Tous droits réservés 26

Couches de base

Niveau 1 Opérations sur secteurs

Niveau 2 Opérations sur blocs

Niveau 3 Opérations sur hiérarchie de répertoires et fichiers organisés par

blocs

(27)

7.3.3Optimisation du déplacement du bras de lecture/écriture

Algorithme de l'ascenseur (“SCAN”)

Algorithme de balayage circulaire (“ C-SCAN ”)

Temps

Temps

(28)

27/02/22 © Robert Godin. Tous droits réservés 28

7.3.4 Taille optimale de bloc

 Grande taille =>

– effet de grappe

– données transférées inutilement

– gaspillage d ’espace pour petits fichiers

 Compromis

– 2K, 4K, 8K pour applications traditionnelles

– >> pour entrepôt de données, multimédia

(29)

7.3.5 Antémémoire (cache memory )

 Mémoire intermédiaire

 Données fréquemment utilisées

 Réduire le temps moyen

Antémémoire disque (disk cache)

– réalisée en mémoire centrale afin

d'accélérer les entrées/sorties sur un

disque

(30)

27/02/22 © Robert Godin. Tous droits réservés 30

Principe de l ’ antémémoire

D i s q u e

B l o c 0

B l o c 5 B l o c 1

B l o c 6 B l o c 2

B l o c 7 B l o c 3

B l o c 8 B l o c 4

B l o c 9

T a m p o n s y s t è m e

B l o c 4

M é m o i r e p r i m a ir e

1 e r

T a m p o n p r o c e s s u s # 1

B l o c 4 2 e

T a m p o n p r o c e s s u s # 2

B l o c 4

3 e

(31)

Antémémoire

Gestionnaire de l'antémémoire disque (“disk cache manager ”)

D is q u e

2 0 B l o c 4

B l o c 2 0

B l o c 7 0

B l o c 5 0

B l o c 0

B l o c 5 B l o c 1

B l o c 6 B l o c 2

B l o c 7 B l o c 3

B l o c 8 B l o c 4

B l o c 9

n o B l o c

4 5 7

S

R é p e r t o i r e d e

l 'a n t é m é m o ir e A n t é m é m o i r e

M é m o i r e p r im a i r e

T a m p o n

(32)

27/02/22 © Robert Godin. Tous droits réservés 32

Écriture en antémémoire

D is q u e

2 0 B l o c 4

B l o c 2 ' 1

B l o c 7 0

B l o c 5 0

B l o c 0

B l o c 5 B l o c 1

B l o c 6 B l o c 2

B l o c 7 B l o c 3

B l o c 8 B l o c 4

B l o c 9

n o B lo c

4 5 7

S

R é p e r t o ir e d e

l 'a n t é m é m o ir e A n t é m é m o i r e

M é m o i r e p r im a i r e T a m p o n

p r o c e s s u s # 1

B l o c 2 '

T a m p o n

(33)

Sélection d ’une victime

Processus #1: lire Bloc 3 et antémémoire pleine !

Choix d ’une victime pour remplacement: Bloc 2 ’ qui est sale (s = 1)

Évacuation de la victime

2 0 B l o c 4

B l o c 2 ' 1

B l o c 7 0

B l o c 5 0

B l o c 0

B l o c 5 B l o c 1

B l o c 6 B l o c 2 '

B l o c 7 B l o c 3

B l o c 8 B l o c 4

n o B l o c

4 5 7

S

R é p e r t o i r e d e

l'a n t é m é m o i r e A n t é m é m o ir e

T a m p o n p r o c e s s u s # 1

T a m p o n

1er

(34)

27/02/22 © Robert Godin. Tous droits réservés 34

Remplacement de la victime

D is q u e

3 0 B l o c 4

B l o c 3 0

B l o c 7 0

B l o c 5 0

B l o c 0

B l o c 5 B l o c 1

B l o c 6 B l o c 2 '

B l o c 7 B l o c 3

B l o c 8 B l o c 4

B l o c 9

n o B lo c

4 5 7

S

R é p e r t o ir e d e

l'a n t é m é m o ir e A n t é m é m o ir e

M é m o i r e p r im a i r e T a m p o n

p r o c e s s u s # 1

B l o c 3

T a m p o n

2 e

3 e

(35)

Stratégie de remplacement

 Maximiser la probabilité d ’accès en antémémoire

 Remplacer le tampon le moins récemment utilisé (Least Recently Used (LRU))

 Remplacer le tampon le moins

fréquemment utilisé (Least Frequently

Used (LFU))

(36)

27/02/22 © Robert Godin. Tous droits réservés 36

Hiérarchie de mémoire

Hierarchical Storage Management

– migration automatique entre niveaux

– contrôlée par paramètres de configuration

Primaire

Secondaire

Tertiaire

Capacité Vitesse

d'accès Coût

(37)

7.4 Fichiers en Java (java.io)

 Accès sériel (stream)

 Accès direct (random access)

I n p u t S t r e a m u n I n p u t S t r e a m ;

u n O c t e t

u n O c t e t = u n I n p u t S t r e a m . r e a d ( ) ;

u n O u t p u t S t r e a m . w r i t e ( u n O c t e t ) ; O u t p u t S t r e a m u n O u t p u t S t r e a m ; P r o g r a m m e

J a v a p o s i t i o n c o u r a n t e

1 2

p o s i t i o n c o u r a n t e d e l a f i n d u S t r e a m

1

2

(38)

27/02/22 © Robert Godin. Tous droits réservés 38

Cache le niveau bloc

N i v e a u 1

O p é r a t i o n s s u r s e c t e u r s N i v e a u 2

O p é r a t i o n s s u r b l o c s N i v e a u 3

O p é r a t i o n s s u r h i é r a r c h i e d e r é p e r t o i r e s e t f i c h i e r s o r g a n i s é s p a r

b l o c s N i v e a u 4

O p é r a t i o n s s u r h i é r a r c h i e d e r é p e r t o i r e s e t f i c h i e r s o r g a n i s é s p a r

o c t e t s

(I n p u t S t r e a m , O u t p u t S t r e a m )

(39)

java.io.InputStream

ObjectInputStream BufferedInputStream

FilterInputStream ByteArrayInputStream

InputStream

DataInput

<<Interface>>

DataInputStream

FileInput Stream

LineNumberInputStream PipedInput

Stream

PushbackInputStream SequenceInputStream

StringBufferInputStream

(40)

27/02/22 © Robert Godin. Tous droits réservés 40

java.io.OutputStream

Buf fe redO utp utSt ream

Fil terOutput Stream ByteArrayOutputStream

OutputStream

DataOutput

<<Interface>>

Dat aOutput Stream FileOutpu tStream

ObjectOutput

<<Interface>>

Ob jectOutp utSt ream

PipedOutputStream

PrintS tream

(41)

java.io.RandomAccessFIle

Dat aOutp ut

<<Interface>>

Dat aInp ut

<<Interface>>

RandomAccessFile

(42)

27/02/22 © Robert Godin. Tous droits réservés 42

Lecture des octets d’un fichier

/ * Lit un fichier et en compte le nombre d'octets */

package LivreJava;

import java.io.*;

public class CompterOctetsFichier{

public static void main (String args[]) { int unOctet;

int compteurOctet;

FileInputStream unFichier;

try{

unFichier = new FileInputStream("C:/ forte4j/ Development/ LivreJava/ Fichier1.txt");

compteurOctet = 0;

while((unOctet = unFichier.read()) != -1) compteurOctet++;

unFichier.close();

System.out.println("Nombre d'octets du fichier Fichier1.txt : "+compteurOctet);

}

catch (IOException e){

System.err.println("Exception\ n" + e.toString());

}

}

}

(43)

/ * Création d'un fichier et écriture d'un entier sous forme d'une suite d'octets dans le fichier */

package LivreJava;

import java.io.*;

public class EcrireEntierEnOctets{

public static void main (String args[]) { FileOutputStream unFichier;

try{

unFichier = new FileOutputStream("C:/ forte4j/ Development/ LivreJava/ Octets.dat");

int unEntier = 1629696561;/ / (97*2^24)+(35*2^16)+(50*2^8)+49 = "a#21" en String;

/ / Convertir unEntier en un tableau de 4 octets byte[] tampon = new byte[4];

for (int i = 3; i>=0;i--){

tampon[i] = (byte)(unEntier & 0XFF); / / Extrait l'octet le moins significatif unEntier >>>=8; / / Décalage de 8 bits (remplissage à 0)

}

unFichier.write(tampon);

unFichier.close();

}

catch (IOException e){

7.4.1 Ecriture et lecture d'un entier dans un

fichier sous forme binaire (FileOutputStream,

FileInputStream)

(44)

27/02/22 © Robert Godin. Tous droits réservés 44

/ * Lecture dans le fichier d'un entier sous forme d'une suite d'octets et conversion en int */

package LivreJava;

import java.io.*;

public class LireEntierEnOctets{

public static void main (String args[]) { FileInputStream unFichier;

try{

unFichier = new FileInputStream("C:/ forte4j/ Development/ LivreJava/ Octets.dat");

byte[] tampon = new byte[4];

unFichier.read(tampon); / / Lecture des 4 octets

/ / Convertir le tableau d'octets tampon en int unEntier int unEntier=0;

for (int i = 0; i<=3;i++){

unEntier <<=8;

unEntier +=((int) tampon[i])&0XFF;

}

unFichier.close();

System.out.println("Valeur décimale de l'entier : "+unEntier);

}

catch (IOException e){

System.err.println("Exception\ n" + e.toString());

}

}

}

(45)

7.4.2 Classes DataInputStream et DataOutputStream

DataInputStream DataInputStream(arg0 : InputStream) read(arg0 : byte[]) : int

read(arg0 : byte[], arg1 : int, arg2 : int) : int readFully(arg0 : byte[]) : void

readFully(arg0 : byte[], arg1 : int, arg2 : int) : void skipBytes(arg0 : int) : int

readBoolean() : boolean readByte() : byte

readUnsignedByte() : int readShort() : short

readUnsignedShort() : int readChar() : char

readInt() : int readLong() : long readFloat() : float readDouble() : double readLine() : String readUTF() : String

DataOutputStream

DataOutputStream(arg 0 : OutputStream) write(arg0 : int) : void

write(arg0 : byte[], arg1 : int, a rg2 : i nt) : void flush() : voi d

writeBoolean(arg0 : bo ole an) : void writeByte(arg0 : int) : void

writeShort(arg0 : int) : void writeChar(arg0 : int) : void writeInt(arg0 : int) : void writeLong(arg0 : long) : vo id writeFloat(arg0 : float) : void writeDoubl e(arg0 : double) : void writeBytes(arg0 : String) : voi d writeChars(arg0 : String) : void writeUTF(arg0 : String) : void size() : int

(46)

27/02/22 © Robert Godin. Tous droits réservés 46

Ecriture d ’un int

/ * Création d'un DataOutputStream à partir d'un fichier et écriture d'un entier dans le fichier */

package LivreJava;

import java.io.*;

public class EcrireEntier{

public static void main (String args[]) { DataOutputStream unFichier;

try{

unFichier =

new DataOutputStream(

new FileOutputStream("C:/ forte4j/ Development/ LivreJava/ UnEntier.dat"));

int unEntier = 1629696561;/ / (97*2^24)+(35*2^16)+(50<<2^8)+49 = "a#21" en String;

unFichier.writeInt(unEntier);

unFichier.close();

}

catch (IOException e){

System.err.println("Exception\ n" + e.toString());

}

}

}

(47)

Lecture du int

/ * Lecture dans le fichier d'un entier à l'aide d'un DataInputStream */

package LivreJava;

import java.io.*;

public class LireEntier{

public static void main (String args[]) { DataInputStream unFichier;

try{

unFichier =

new DataInputStream(

new FileInputStream("C:/ forte4j/ Development/ LivreJava/ UnEntier.dat"));

int unEntier = unFichier.readInt();

unFichier.close();

System.out.println("Valeur décimale de l'entier : "+unEntier);

}

catch (IOException e){

System.err.println("Exception\ n" + e.toString());

}

(48)

27/02/22 © Robert Godin. Tous droits réservés 48

7.4.3 Fichiers de type texte

BufferedWrite r

Writer

CharArrayWriter

FileWriter OutputStreamWriter FilterWriter PipedWri ter PrintWriter StringWriter

BufferedReader

Reader

CharArrayReader

FileReader

InputStreamReader FilterReader

LineNumberReader

PipedReader

PushbackReader StringReader

(49)

Écrire du texte

/ * Création d'un FileWriter à partir d'un fichier et écriture d'un entier dans le fichier sous forme d'une chaîne de caractères */

package LivreJava;

import java.io.*;

public class EcrireEntierTexte{

public static void main (String args[]) { FileWriter unFichier;

try{

unFichier =

new FileWriter("C:/ forte4j/ Development/ LivreJava/ UnEntier.txt");

unFichier.write("1629696561");

unFichier.close();

}

catch (IOException e){

System.err.println("Exception\ n" + e.toString());

}

(50)

27/02/22 © Robert Godin. Tous droits réservés 50

PrintWriter : conversion en texte

/ * Création d'un PrintWriter à partir d'un fichier et écriture d'un entier dans le fichier sous forme d'une chaîne de caractères */

package LivreJava;

import java.io.*;

public class EcrireEntierTextePrintWriter{

public static void main (String args[]) { PrintWriter unFichier;

try{

unFichier =

new PrintWriter(

new FileWriter("C:/ forte4j/ Development/ LivreJava/ UnEntierPW.txt"));

unFichier.print(1629696561);

unFichier.close();

}

catch (IOException e){

System.err.println("Exception\ n" + e.toString());

}

}

}

(51)

PrintStream et PrintWriter

PrintStream PrintStream(arg0 : OutputStream)

PrintStream(arg0 : OutputStream, arg1 : boolean) flush() : void

close() : void

checkError() : boolean setError() : void write(arg0 : int) : void

write(arg0 : byte[], arg1 : int, arg2 : int) : void print(arg0 : boolean) : void

print(arg0 : char) : void print(arg0 : int) : void print(arg0 : long) : void print(arg0 : float) : void print(arg0 : double) : void print(arg0 : char[]) : void print(arg0 : String) : void print(arg0 : Object) : void println() : void

println(arg0 : boolean) : void println(arg0 : char) : void println(arg0 : int) : void println(arg0 : long) : void println(arg0 : float) : void println(arg0 : double) : void println(arg0 : char[]) : void println(arg0 : String) : void println(arg0 : Object) : void

PrintWriter PrintWriter(arg0 : Writer)

PrintWriter(arg0 : Writer, arg1 : boolean) PrintWriter(arg0 : OutputStream)

PrintWriter(arg0 : OutputStream, arg1 : boolean) flush() : void

close() : void

checkError() : boolean setError() : void write(arg0 : int) : void

write(arg0 : char[], arg1 : int, arg2 : int) : void write(arg0 : char[]) : void

write(arg0 : String, arg1 : int, arg2 : int) : void write(arg0 : String) : void

print(arg0 : boolean) : void print(arg0 : char) : void print(arg0 : int) : void print(arg0 : long) : void print(arg0 : float) : void print(arg0 : double) : void print(arg0 : char[]) : void print(arg0 : String) : void print(arg0 : Object) : void println() : void

println(arg0 : boolean) : void println(arg0 : char) : void println(arg0 : int) : void println(arg0 : long) : void

(52)

27/02/22 © Robert Godin. Tous droits réservés 52

Lire du texte

/ * Lecture dans le fichier d'un entier sous forme de texte à l'aide d'un FileReader */

package LivreJava;

import java.io.*;

public class LireEntierTexte{

public static void main (String args[]) { FileReader unFichier;

try{

char[] tableauChar = new char[10];

unFichier = new FileReader("C:/ forte4j/ Development/ LivreJava/ UnEntier.txt");

unFichier.read(tableauChar,0,10);

int unEntier = Integer.parseInt(new String(tableauChar,0,10));

unFichier.close();

System.out.println("Valeur décimale de l'entier : "+unEntier);

}

catch (IOException e){

System.err.println("Exception\ n" + e.toString());

}

}

}

(53)

7.4.4 Représentation interne des caractères et traitement des fins de ligne

01100001 01100010 01100011 00001101 00001010 00110001 00110010 00001101 00001010 a b c \r \n 1 2 \r \n

Jeu de caractères ASCII 8 bits

(54)

27/02/22 © Robert Godin. Tous droits réservés 54

7.4.5 Analyse lexicale avec la classe StreamTokenizer

FileReader unFichier = new FileReader("C:/ forte4j/ Development/ LivreJava/ Plants.txt");

StreamTokenizer unStreamTokenizer = new StreamTokenizer(unFichier);

while(unStreamTokenizer.nextToken()!= StreamTokenizer.TT_EOF){/ / fin du fichier ? / / Lecture du noPlant

if(unStreamTokenizer.ttype == StreamTokenizer.TT_NUMBER){/ / Est-ce bien un nombre ? noPlant = (int) unStreamTokenizer.nval; / / nval est un double !

} else

{System.out.println("Le format du fichier est incorrect : noPlant attendu"); System.exit(1);}

/ / Lecture de la description unStreamTokenizer.nextToken();

if(unStreamTokenizer.ttype == (int)'"'){/ / Est-ce bien une chaîne encadrée par " ? description = unStreamTokenizer.sval;

} else

{System.out.println("Le format du fichier est incorrect : description attendue"); System.exit(1);}

/ / Lecture du prixUnitaire unStreamTokenizer.nextToken();

if(unStreamTokenizer.ttype == StreamTokenizer.TT_NUMBER){/ / Est-ce bien un nombre ? prixUnitaire = unStreamTokenizer.nval;

} else

{System.out.println("Le format du fichier est incorrect : prix attendu"); System.exit(1);}

}

(55)

7.4.6 Traitement d'un document XML avec SAX et DOM

<?xml version="1.0" encoding="ISO-8859-1"

standalone="yes"?>

<!DOCTYPE Catalogue [

<!ELEMENT Catalogue (Plant+)>

<!ELEMENT Plant (noPlant,description,prixUnitaire)>

<!ELEMENT noPlant (#PCDATA)>

<!ELEMENT description (#PCDATA)>

<!ELEMENT prixUnitaire (#PCDATA)>

]>

<Catalogue>

<Plant>

<noPlant>10</ noPlant>

<description>Cèdre en boule</ description>

<prixUnitaire>10.99</ prixUnitaire>

</ Plant>

<Plant>

<noPlant>20</ noPlant>

<description>Sapin</ description>

<prixUnitaire>12.99</ prixUnitaire>

</ Plant>

<Plant>

<noPlant>40</ noPlant>

<description>Epinette bleue</ description>

<prixUnitaire>25.99</ prixUnitaire>

(56)

27/02/22 © Robert Godin. Tous droits réservés 56 / ** * Création d'un arbre DOM avec JAXP

* Parcours de l'arbre pour extraire les données et les insérer * dans le vecteurs d'objets Plant

*/

package LivreJava;

/ / Packages de JAXP import javax.xml.parsers.*;

import org.xml.sax.*;

import org.xml.sax.helpers.*;

import org.w3c.dom.*;

import java.io.*;

import java.util.*;

public class ExempleJAXPPlants {

public static void main(String[] args) throws Exception {

/ / Création d'un DocumentBuilderFactory et configuration des paramètres

DocumentBuilderFactory unDocBuildFact = DocumentBuilderFactory.newInstance();

unDocBuildFact.setValidating(true);

unDocBuildFact.setIgnoringElementContentWhitespace(true);

/ / Création d'un DocumentBuilder

DocumentBuilder unDocumentBuilder = unDocBuildFact.newDocumentBuilder();

/ / Parsage du document Document unDocument =

unDocumentBuilder.parse("C:/ forte4j/ Development/ LivreJava/ Plants.xml");

(57)

Vector vecteurDePlants = new Vector();

Node unElementCatalogue = unDocument.getDocumentElement(); / / Cherche l'élément racine <catalogue>

/ / Itérer sur les noeuds <Plant> qui sont les enfants de <Catalogue>

NodeList listeNodePlants = unElementCatalogue.getChildNodes();

int tailleListe = listeNodePlants.getLength();

for (int i = 0; i < tailleListe ; i++) {

Node unNodePlant = listeNodePlants.item(i); / / ELEMENT <Plant>

Node unNodeNoPlant = unNodePlant.getFirstChild(); / / ELEMENT <noPlant>

/ / la valeur est dans le premier enfant

int noPlant = Integer.parseInt(unNodeNoPlant.getFirstChild().getNodeValue());

Node unNodeDescription = unNodeNoPlant.getNextSibling(); / / ELEMENT <description>

String description = unNodeDescription.getFirstChild().getNodeValue();

Node unNodePrixUnitaire = unNodeDescription.getNextSibling(); / / ELEMENT <prixUnitaire>

double prixUnitaire = Double.parseDouble(unNodePrixUnitaire.getFirstChild().getNodeValue());

Plant unPlant = new Plant(noPlant, description, prixUnitaire);

System.out.println(noPlant + " " + description + " " + prixUnitaire);

vecteurDePlants.addElement(unPlant);

} } }

(58)

27/02/22 © Robert Godin. Tous droits réservés 58

7.4.7 Utilisation de la classe java.io.File

 Vérifier l ’existence d ’un fichier

package LivreJava;

import java.io.*;

import javax.swing.JOptionPane;

public class VerifierExistenceFichier { public static void main (String args[]) { FileOutputStream unFichier;

try{

File leFile = new File("C:/ forte4j/ Development/ LivreJava/ Octets.dat");

if (leFile.exists()){

String reponse =

JOptionPane.showInputDialog("Voulez-vous détruire le contenu existant (oui ou non)?");

if(reponse == "non"){

System.out.println("Le fichier demeure tel quel");

System.exit(0);

} }

unFichier = new FileOutputStream(leFile);

(59)

Créer un répertoire

package LivreJava;

import java.io.*;

public class CreerRepertoire{

public static void main (String args[]) throws Exception {

File unFile = new File("C:/ forte4j/ Development/ DossierA/ DossierB/ ");

unFile.mkdirs();

if(unFile.exists()){System.out.println("Il a été créé");}

else{System.out.println("Il n'a pas été créé");}

}

}

(60)

27/02/22 © Robert Godin. Tous droits réservés 60

7.4.8 Dialogue de sélection de fichier avec la classe JFileChooser

package LivreJava;

import java.io.*;

import javax.swing.*;

public class CreerFichierFileChooser extends JFrame { public CreerFichierFileChooser () throws Exception { JFileChooser unFileChooser = new JFileChooser();

unFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);

int résultat = unFileChooser.showSaveDialog(this);

if (résultat != JFileChooser.CANCEL_OPTION){

File leFile = unFileChooser.getSelectedFile();

if (leFile != null && !(leFile.getName().equals(""))){

FileOutputStream unFichier = new FileOutputStream(leFile);

(61)

7.5Organisation par enregistrements

Enregistrement (record ), champ (field )

TYPE PlantCatalogue = ENREGISTREMENT

noCatalogue : ENTIER;

description : CHAINE[30];

prixUnitaire : REEL;

FIN.

noCatalogue description prixUnitaire

10 Cèdre en boule 10.99

20 Sapin 12.99

40 Epinette bleue 25.99

50 Chêne 22.99

60 Erable argenté 15.99

70 Herbe à puce 10.99

80 Poirier 26.99

81 Catalpa 25.99

(62)

27/02/22 © Robert Godin. Tous droits réservés 62

Niveau 4 : enregistrement

N i v e a u 1

O p é r a t i o n s s u r s e c t e u r s N i v e a u 2

O p é r a t i o n s s u r b l o c s N i v e a u 3

O p é r a t i o n s s u r h i é r a r c h i e d e r é p e r t o i r e s e t f i c h i e r s o r g a n i s é s p a r

b l o c s N i v e a u 4

O p é r a t i o n s s u r h i é r a r c h i e d e r é p e r t o i r e s e t f i c h i e r s o r g a n i s é s p a r

e n r e g i s t r e m e n t s

(63)

Méthode et chemin d ’accès

Méthode d'accès (access method) ou mode d'accès

– manière d'accéder d'un point de vue logique

 sériel, séquentiel, sélection par clé, par intervalle

Chemin d'accès (access path)

– chemin dans les structures de données

(64)

27/02/22 © Robert Godin. Tous droits réservés 64

Méthode d'accès sériel

 Patron d ’itérateur

 Ordre => séquentiel

PremierEnregistrement ( TypeEnregistrement , TamponEnregistrement , …) TANT QUE pas la fin de la collection

traitement d'un enregistrement

EnregistrementSuivant ( TypeEnregistrement , TamponEnregistrement ,…)

FIN TANT QUE

(65)

Méthode d'accès par sélection basée sur un identifiant d'enregistrement

 Identifiant d ’enregistrement (IDE)

– accès rapide

SélectionnerEnregistrement ( IDE , TamponEnregistrement ) Entrée : IDE

Sortie : TamponEnregistrement

CréerEnregistrement ( IDE , TamponEnregistrement ) Entrée : TamponEnregistrement

IDE sera une entrée ou une sortie selon le cas ModifierEnregistrement ( IDE , TamponEnregistrement )

Entrée : IDE, TamponEnregistrement

SupprimerEnregistrement ( IDE )

(66)

27/02/22 © Robert Godin. Tous droits réservés 66

Méthode d'accès par sélection basée sur une clé d'accès

Clé d'accès (access key)

– champ ou combinaison de champs utilisés comme critère de sélection

Clé simple/composée

Clé unique (unique key)

Sélection par intervalle

Méthode d ’accès multidimensionnelle

(67)

7.5.1 Organisation primaire et secondaire

Organisation primaire (primary organization)

placement des enregistrements

sériel, séquentiel, index primaire, hachage, grappe, ...

gestion des IDE

Organisation secondaire (secondary organization )

liste , arbre, index secondaire, etc.

référence aux IDE

(68)

27/02/22 © Robert Godin. Tous droits réservés 68

Fichier homogène (homogeneous) ou hétérogène (heterogeneous)

Niveau 4 : SGF ou SGBD ?

(69)

7.5.4 Alternatives de réalisation de l'IDE

idFichier, NER

l'adressage relatif

(e.g. organisation “relative” de NON STOP SQL)

l'indexage

 (e.g. organisation “key sequenced” sur “SYSKEY” de NON STOP SQL)

idFfichier, #bloc, #séquence (e.g. DBKEY DBMS-32 (CODASYL), ROWID ORACLE).

idFichier, #bloc, #octet (e.g. “entry-sequenced” de NON STOP SQL)

idFichier, clé unique (e.g. “key-sequenced” de NON STOP SQL, logical ROWID de ORGANIZATION INDEX Oracle 8)

IDE logique

(e.g. OID dans les SGBDO)

(70)

27/02/22 © Robert Godin. Tous droits réservés 70

7.5.5 Représentation interne des enregistrements

 Enregistrements => blocs

 Taille fixe ou variable

(71)

7.4.5.1Enregistrements de taille fixe

 Chaque champ => nombre fixe d ’octets

 Remplissage par caractère neutre

T o t a l : 4 2 o c t e t s d e s c r ip t io n

C H A I N E [ 3 0 ]

u n o c t e t ( A S C I I 8 b it s ) p a r c a r a c t è r e ( r e m p lis s a g e a v e c e s p a c e s ) ( 3 0 o c t e t s )

p r ix U n it a ir e R E E L

p o in t - f lo t t a n t 6 4 b it s ( 8 o c t e t s ) n o C a t a lo g u e

E N T I E R b in a ir e 3 2 b it s

( 4 o c t e t s )

(72)

27/02/22 © Robert Godin. Tous droits réservés 72

7.4.5.2Enregistrements de taille variable

 Frontières de champs et d ’enregistrements

indicateur de taille en entête de chaque champ (descripteur de champ)

délimiteur (code réservé)

index en entête de l'enregistrement (descripteur d'enregistrement)

d e s c r ip t io n p r ix U n it a ir e

n o C a t a lo g u e

t a ille N o C a t a lo g u e t a ille D e s c r ip t io n t a ille P r ix U n it a ir e

d e s c r ip t io n p r ix U n it a ir e

n o C a t a lo g u e

description prixUnitaire

noCatalogue

(73)

7.6Adressage relatif

Allocation d'espace sérielle (serial space allocation)

avec/sans chevauchement de bloc

Facteur de blocage (FB, blocking factor)

nombre d'enregistrements par bloc

Numéro de bloc = NER / FB

Position relative dans le bloc =

NER MOD FB  taille d'un enregistrement

NER = champ ?

IDE = idFichier, NER

Gros enregistrement : chevauchement

N u m é r o d e b l o c

N u m é r o d 'e n r e g i s t r e m e n t

r e l a t i f

0

1

2

0 1 2 3 4

5 6 7 8 9

1 0 1 1 1 2

E s p a c e p e r d u

(74)

27/02/22 © Robert Godin. Tous droits réservés 74

Liste des espaces libres (free list)

P o i n t e u r s u r

p r e m i e r e s p a c e l i b r e

E s p a c e l i b r e

E s p a c e l i b r e

E s p a c e l i b r e E s p a c e l i b r e

E s p a c e l i b r e

0 1 2 3 4

5 6 7 8 9

1 0 1 1 1 2 1 3 1 4

B l o c r é s e r v é à

l ' e n t ê t e d e f i c h i e r

(75)

7.7 Allocation d'espace pour les enregistrements de taille variable

 Analogue à l ’allocation d ’espace pour les fichiers

 Granularité plus fine

(76)

27/02/22 © Robert Godin. Tous droits réservés 76

7.7.1 Allocation sérielle pour enregistrements de taille variable

 Gestion d ’espace libre

– ne pas récupérer

– liste libre

mieux ajusté

premier ajusté

Fragmentation interne au fichier

 IDE = idFichier, #bloc, #octet

– enregistrement cloué

0 N u m é r o

d e b l o c

1

2

(77)

7.7.2 Récupération d'espace et adressage structuré par bloc

 IDE = idFichier, #bloc, #séquence ( clouage partiel)

Suppression de #2

3 Espace libre Enr. #3 Enr. #2 Enr. #1

Taille de l'index des positions

1 2 3

Index des positions des enregistrements

(78)

27/02/22 © Robert Godin. Tous droits réservés 78

7.7.3Gestion des débordements

 Même IDE

 Oracle : PCTFREE

B l o c d 'a n c r a g e

B l o c d e d é b o r d e m e n t

B lo c v i r t u e l d e t a i ll e v a r i a b le

0 N u m é r o

d e b l o c

1

2

(79)

Découpage de l ’enregistrement

2 e m o r c e a u B lo c

d 'a n c r a g e

B l o c d e d é b o r d e m e n t

0 N u m é r o

d e b l o c

1

2

1 e r m o r c e a u

(80)

27/02/22 © Robert Godin. Tous droits réservés 80

7.7.4 Adressage logique

 IDE découplé de sa position physique

 Souplesse d ’allocation d ’espace

Ex: OID dans les BD objet

M é c a n i s m e d e t r a d u c t i o n ( e . g . i n d e x ) I D E

l o g i q u e

a d r e s s e p h y s i q u e

(81)

7.7.5 Découpage en morceaux de taille fixe

 Découper un enregistrement de taille variable en morceaux de taille fixe

 Allocation des morceaux par

adressage relatif

(82)

27/02/22 © Robert Godin. Tous droits réservés 82

7.7.6Allocation d'espace pour gros enregistrements de taille variable

 Allocation chevauchante

– blocs consécutifs

– diminuer le nombre de positionnements

 Réalisation de l ’IDE

– adressage logique

– adresse de suivi

(83)

7.7.7Allocation hybride pour les enregistrements de taille variable

 Organisations spécialisées selon la taille des champs

– un mécanisme pour petits champs

– un autre pour les gros champs

référence externe (e.g. chemin, URL)

(84)

27/02/22 © Robert Godin. Tous droits réservés 84

7.8Allocation sérielle par grappe homogène

Grappe (cluster)

ensemble d ’enregistrements regroupés physiquement

Clé de la grappe (cluster key)

critère de regroupement

ensemble de champs

Identifiant de grappe (IDG, cluster identifier)

IDG = #bloc, valeur de la clé de grappe

(85)

Exemple : insertion avec idMembre = 2

idMembre datePrêt idExemplaire

2 15/ 08/ 2000 75

3 16/ 08/ 2000 200

1 17/ 08/ 2000 100

4 18/ 08/ 2000 400

2 19/ 08/ 2000 50

1 20/ 08/ 2000 300

3 21/ 08/ 2000 150

2 1 5 / 0 8 / 2 0 0 0 7 5

0

3 1 6 / 0 8 / 2 0 0 0 2 0 0

1 1 7 / 0 8 / 2 0 0 0 1 0 0

4 1 8 / 0 8 / 2 0 0 0 4 0 0

N u m é r o

d e b l o c I D G = # b l o c , c l é d e g r a p p e

0 , 2 0 , 3 0 , 1 0 , 4

0

3 1 6 / 0 8 / 2 0 0 0 2 0 0

1 1 7 / 0 8 / 2 0 0 0 1 0 0

4 1 8 / 0 8 / 2 0 0 0 4 0 0

N u m é r o

d e b l o c I D G

0 , 3 0 , 1 0 , 4

2 1 5 / 0 8 / 2 0 0 0 7 5

2 1 9 / 0 8 / 2 0 0 0 5 0

0 , 2

Références

Documents relatifs

public class exempleInsertionsNouveauxObjetsOMLJava { public static void main (String args []){. /* Ouvrir

CONSTRAINT annéeSup0 CHECK(annéeParution.valeurAnnée &gt; 0), CONSTRAINT referenceTableEditeur éditeur SCOPE IS Editeur) CREATE INDEX indexEditeurLivre ON Livre(éditeur). CREATE

Ecrire prêt au journal (vider tampons

noSequence : INTEGER {Clé candidate : codeMatricule}. codeMatricule

CREATE VIEW Article (noArticle, description, prixUnitaire, quantitéEnStock)AS SELECT C.noArticle, description, prixUnitaire, quantitéEnStock FROM Catalogue AS C, Inventaire AS

 Méthodes d’accès spatiales (Spatial Acces Method - SAM ).. – objets

– Deux opérations de lecture ou d'écriture dans deux transactions différentes sont non permutables si elles portent sur la même donnée et au moins une des deux est

public static void main (String args []) throws Exception { // Création d'une Connection globale pour l'application UsineConnection uneUsineConnection =