cs_Gerard
Messages postés121Date d'inscriptionjeudi 10 janvier 2002StatutMembreDernière intervention 7 août 2018
-
5 sept. 2010 à 03:45
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 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?
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 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
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 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.