Juste une petite précision:
Tous les serveurs sont indépendants , il ne partagent pas de base de données, et le serveur n'a aucune relation avec un site web. Toutes les bases de données sont donc locales, et uniques par serveur. Et, si je ne thread pas mon programme de serveur, il n'y aura aucun accès concurrent.
Voilà comment je crée la tables des joueurs:
Sous SQLite
create table if not exists trainers (id integer primary key, name varchar(20) unique, laston char(10), auth int, banned boolean, salt varchar(7), hash varchar(32), ip varchar(39)));
Sous PostGreSQL
create table trainers (id serial, name varchar(20), laston char(10), auth int, banned boolean, salt varchar(7), hash varchar(32), ip varchar(39), primary key(id), unique(name))
Pour les index
create index tname_index on trainers (name)
create index tip_index on trainers (ip)
Déjà j'apprécie moyen la différence de syntaxe à adopter dans les deux cas pour que le champ de la clé primaire s'incrémente automatiquement, enfin bon ^^
Donc j'ai un fichier de 15000 utilisateurs pour les tests (d'ailleurs maintenant le nombre de personne connectées à mon programme serveur sur leur programme client est souvent au dessus de 200, et monté à 280)
Avec mon système, je lit le fichier et insère le tout dans mes structures en mémoire quasiment instantanément.
Quand j'insère dans les bases de données ça prend plus de temps...
Pour info tous les traitements nécessaires à l'insertion dans la base de données, boucle comprise et requête, mais en étant déconnecté de la base de données, prennent 0.06 secondes. Les temps observés sont donc seulement dû à la base de données ou à la liaison avec la base de données, pas à mon programme.
Avec SQLite:
1 2 3 4
| Insertion mémoire -> base de données
Sans les index: 163 secondes
Avec les index: 230 secondes |
Avec PostGreSQL:
1 2 3 4
| Insertion mémoire -> base de données
Sans les index: 7.4 secondes
Avec les index: 8.2 secondes |
PostGreSQL remporte donc haut la main le concours ^^
C'est moins rapide que mon système (<1 seconde), mais ça convient. De plus, si je threade mon serveur pour avoir les appels à la base de donnée séparés du thread principal (et éviter les latences, qui bloqueraient l'ensemble du serveur pendant ce laps de temps), alors j'aurais un système qui marche impeccablement.
Enfin si j'avais utilisé la fonctionnalité batch du driver de PostGreSQL pour faire une insertion en masse j'aurais peut être été encore plus rapide.
Je prévois quand même de laisser SQLite par défaut pour les gens qui créent leur serveur sur leur ordinateur personnel et n'y connaissent rien.
Aussi, dans PGAdmin lorsque je veux regarder ma table fraîchment créee il me parle de faire un "VACUUM", je vais regarder ce que c'est. Il me laisse quand même regarder la table.
En tout cas merci beaucoup pour vos conseils, j'ai abouti à un système dont je suis pleinement satisfait
Merci encore
@+
Partager