Mémoire locale et mémoire globale

Messages postés
123
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
7 août 2018
- - Dernière réponse : Caribensila
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
26 juillet 2018
- 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
Afficher la suite 

3 réponses

Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
4
0
Merci
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
Commenter la réponse de Guillemouze
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
26 juillet 2018
11
0
Merci
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.
Commenter la réponse de Caribensila
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
26 juillet 2018
11
0
Merci
... Et ne pas négliger les défragmentations fréquentes des DD !
Commenter la réponse de Caribensila