Mémoire locale et mémoire globale

cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018 - 5 sept. 2010 à 03:45
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 - 6 sept. 2010 à 16:13
Bonjour,
J'ai entrepris la refonte de mon serveur - qui marche par ailleurs très bien - une centaine de joueurs (de bridge) par jour dans l'objectif suivant.
Actuellement, à chaque transaction avec le serveur, et il y en a beaucoup, le joueur se connecte et toutes ses données sont lues dans les différents fichiers qui lui sont consacrés.
Pour éviter ces accès disques et accélérer le processus (je n'ai pas encore de problème, mais j'ai déjà eu un disque dur en défaut) je pense passer les données des joueurs qui se connectent la première fois en mémoire, et ensuite aller y relire les données.
Un joueur est défini par un objet
TJoueur = class(Tobject)      //données propres à un joueur quelque soit son interface
  pseudo: String;             //pseudo
  FirstName: string;          //prénom
  Name: string;               //nom
  Password: string;
  email: string;          //identifiant email clé primaire
  IP: string;             //IP du client
  FichierClient: string;  //fichier où se trouvent les données du client
  ChoixTournoi: string;   //choix fait précédent la requête d'une donne
  TournoisJoués: TStringList; //Liste des tournois joués par ce joueur
  DonnesEnCours: TStringList; //tournois non terminés
  Journal: TStringList;   //journal des actions faites par le joueur
  Amis: TMemoryStream;   //journal des actions faites par le joueur
  Conventions: TMemoryStream;   //journal des actions faites par le joueur
  SerieJoueur: string;    //série du joueur
  Params: TStringlist;    //contenu du fichier Data
  DonneEnCours: string;   //tournoi dont la donne est la dernière envoyée: on attend les résultats
  Board: integer;         //Dernier étui envoyé
  BoundContext: Tlist;    //list de tous les "MiniAfficheurs" connectés
  LastAccessDateTime: TdateTime;
  Language: string;
  PendingMessage: TStringList;
  Wb5Version: string;
end;                      //version en cours de Wbridge5
PJoueur= ^TJoueur;

qui peut être assez consommateur de mémoire.
Ma question: Je voudrais savoir si j'ai bien compris l'utilisation de la mémoire...
Si je fais:
UnJoueur:=TJoueur.create

ou
new(Pjoueur)

Dans le premier cas je crée l'objet en mémoire locale et de le second en mémoire globale? Est-ce bien cela?

Merci

3 réponses

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
6 sept. 2010 à 09:13
Pas du tout.
le type TJoueur est un objet, donc un pointeur implicite.
PJoueur est un pointeur sur un objet, donc un pointeur sur un pointeur, ce qui est, dans la grande majorité des cas, inutile.

var 
  UnJouuer: PJoueur;
begin
  new(UnJoueur); //la, tu as UnJoueur qui pointe sur un objet nil
  UnJoueur^.Create; // la tu as un pointeur sur un objet valide
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
6 sept. 2010 à 16:06
Salut,

« je pense passer les données des joueurs qui se connectent la première fois en mémoire, et ensuite aller y relire les données. »

Certes en faisant ça tu vas limiter les accès disque et accélérer le processus, mais le risque c'est le stack overflow quand il y aura beaucoup de connexions simultanées.

A ta place, je ne chargerais en mémoire que le strict nécessaire pour permettre de jouer. Tous les renseignements non cruciaux, comme "Liste des tournois joués par ce joueur", etc... et autres resteraient sur le DD et feraient l'objet d'une MAJ à la déconnexion par exemple.
Et pour accélérer l'accès au DD, tu aurais intérêt à regrouper les divers fichiers de chaque joueur au même endroit de ton DD avec une bonne gestion de cet espace grâce à un TFileStream ou un THandleStream.

En fait, tu es en plein dans l'éternel problème du bon équilibre entre la gestion de l'espace mémoire disponible et l'amélioration des performances. Il n'y a pas de miracle à attendre car l'un se fait toujours au détriment de l'autre et le bon équilibre se trouve souvent en tâtonnant; chaque application ayant ses propres exigences.
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
6 sept. 2010 à 16:13
... Et ne pas négliger les défragmentations fréquentes des DD !
0
Rejoignez-nous