Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1465 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  tableau de 900 000 cases (implosion du pc)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

tableau de 900 000 cases (implosion du pc)

n°852839
tetsidule
Posté le 17-09-2004 à 18:34:05  profilanswer
 

Bonjour tt le monde,
 
J'ai un problème théorique : je dois lire un fichier texte possédant environ 900 000 lignes,mais susceptible d'être plus grand (disons 900 000 pour l'instant :p). Chaque ligne contient les coordonnées d'un objet à un pas de temps.  
 
Schématiquement, ça ressemble à ça :  
 
xt0 yt0 zt0 AngleXt0 AngleYt0 AngleZt0
xt1 yt1 zt1 AngleXt1 AngleYt1 AngleZt1
xt2 yt2 zt2 AngleXt2 AngleYt2 AngleZt2
...
xtn ytn ztn AngleXtn AngleYtn AngleZtn
 
 
La ieme ligne indique la position de l'objet à l'instant i.
 
Je dois être capable d'animer un objet suivant la trajectoire décrite par ces positions. Jusqu'ici aucun probleme.
 
Je dois pouvoir utiliser un curseur pour me déplacer dans le temps, en avant comme en arrière. Mon problème est le suivant : comment minimiser le temps d'attente de l'utilisateur lorsqu'il place son curseur à ti et qu'il veut voir l'objet à sa position à l'instant ti ?
 
Ma réponse bête est : on lit tout le fichier dès le départ, on stocke toutes les positions dans un tableau géant et on va chercher ces positions dans le tableau quand on en a besoin.
 
Cette technique promet d'être particulièrement gourmande en mémoire vu la taille du tableau, sans compter qu'il y a d'autres infos que seulement des coordonnées (entre autre l'objet est articulé...)
 
j'ai entendu parler du mappage de fichier, de lecture par bloc... Quelqun pourrait il ou elle m'en dire plus ?
 
En vous remerciant boucou boucou d'avance  :jap:

mood
Publicité
Posté le 17-09-2004 à 18:34:05  profilanswer
 

n°853058
el muchach​o
Comfortably Numb
Posté le 18-09-2004 à 08:09:28  profilanswer
 

Tu peux p-ê indexer tes lignes avec le temps t (ou le numéro de ligne xtn , ce qui revient +/- au même) comme clé dans une hash_map ou qq chose comme ça. La hash_map te donne la position de la ligne à lire dans le fichier, par exemple. Après, il y a certainement des optimisaions à faire pour diminuer le nombre d'accès fichier si tu dois lire plusieurs lignes d'un coup.
Et si tu peux stocker ton fichier en binaire plutôt qu'en texte, ça sera à la fois plus rapide et moins gourmand.


Message édité par el muchacho le 18-09-2004 à 08:51:44
n°853064
Lam's
Profil: bas.
Posté le 18-09-2004 à 09:55:34  profilanswer
 

Attention, ceci n'est pas du C++, c'est du C.
 
Pour éviter les temps de latence, utiliser mmap est effectivement la meilleure solution. (Sous unix: man mmap. Sous windows, ça fonctionne avec une autre API). Ca te permet de considérer que le fichier est tout entier en mémoire, et c'est l'OS et le CPU qui font le reste (tu économises énormément de copies entre l'OS et ton appli, et ça t'évites de passer du temps CPU dans les APIS de fread(), etc.)
 
Et comme le dit el muchacho, pre-stocker les positions de début de chaque ligne, c'est franchement pas con (pas dans une hash-map: plutôt un simple tableau linéaire qui te donne l'offset (l'équivalent de ftell() ) de chaque début de ligne, ou même de chaque ligne paire, ou chaque ligne sur 5, etc. Après, avec une recherche dichotomique de base, tu as tout ce que tu veux (où un indexage direct si le temps est représenté de façon linéaire dans ton fichier)...
 
De longues explications Sous Windows : http://msdn.microsoft.com/library/ [...] namemo.asp


Message édité par Lam's le 18-09-2004 à 09:59:04
n°853075
Taz
bisounours-codeur
Posté le 18-09-2004 à 10:40:26  profilanswer
 

moi déjà, je stockerais le fichier sous format binaire, parce que sinon, ça sert à rien de mmaper : faudra à chaque fois faire des conversion. la conversion en format binaire peut être faite dans un fichier temporaire qui sera ensuite chargé en mémoire. avec un format binaire, tu as aussi l'avantage que tes enregistrement sont de taille fixe : plus de problème d'indexage.

n°853135
el muchach​o
Comfortably Numb
Posté le 18-09-2004 à 12:50:04  profilanswer
 

Taz a écrit :

moi déjà, je stockerais le fichier sous format binaire, parce que sinon, ça sert à rien de mmaper : faudra à chaque fois faire des conversion. la conversion en format binaire peut être faite dans un fichier temporaire qui sera ensuite chargé en mémoire. avec un format binaire, tu as aussi l'avantage que tes enregistrement sont de taille fixe : plus de problème d'indexage.


 
Ah oui, c'est connissime. :sarcastic:

n°853377
tetsidule
Posté le 19-09-2004 à 01:08:51  profilanswer
 

je vais étudier la question à vos lumières... la suite au prochain épisode !

n°853378
Taz
bisounours-codeur
Posté le 19-09-2004 à 01:20:12  profilanswer
 

ouais enfin surtout ma proposition sur laquelle on s'accorde

n°853522
notalone
je kif le c++
Posté le 19-09-2004 à 14:08:30  profilanswer
 

j en ai fait des file mapping sous win en fait ca revient au meme que de charger le fic en memoire ca bouffe autant de meme
ton pb ca me fait penser au moteur de bd multidimensionnel ils utilisent la compression pour gerer des tablo gigantesk ca reste plu rapide de decompresser a la volée que d acceder au disque


---------------
ici c ma signature j ai pas encore reflechi a ce que je vais mettre
n°853526
Taz
bisounours-codeur
Posté le 19-09-2004 à 14:10:20  profilanswer
 

je sais pas comment ça fonctionne le mmap de windows, mais sous  GNU/Linux ça fonctionne à merveille et c'est super efficace

n°853914
Joel F
Real men use unique_ptr
Posté le 20-09-2004 à 09:49:46  profilanswer
 

Taz a écrit :

je sais pas comment ça fonctionne le mmap de windows, mais sous  GNU/Linux ça fonctionne à merveille et c'est super efficace


 
euh [:le kneu] sous windows aussi

mood
Publicité
Posté le 20-09-2004 à 09:49:46  profilanswer
 

n°854204
tetsidule
Posté le 20-09-2004 à 16:24:03  profilanswer
 

pour des raisons indépendantes de ma volonté  :ange: je code sous visual c++ un prog sensé tourner sous unix.
 
les fonctions de mmap sous windows ne me semblent pas franchement portables, et ça va être dur d'utiliser la version native sous unix de mmap, puisque je compile sous windows. connaissez vous des librairies portables (ou tout du moins adaptables sans trop de pb) qui m'aiderait à créer mes mmap maison ?
 
en tout les cas merci de votre aide.

n°854217
tetsidule
Posté le 20-09-2004 à 16:39:53  profilanswer
 

glup. finalement je crois que je vais devoir essayer autre chose (hypothèse : lire mon fichier par blocs...) depuis que je suis tombé sur cette citation de Bjarne Stroustrup :  
 
"There are things you just can't do in a machine-independent way,
 
 specialized instructions (e.g. vector operations,
 I/O instructions, memory mapping instructions)"
 
Merci de votre aide, je vous tiens au courant.
 
La suite au prochain épisode...

n°854258
Joel F
Real men use unique_ptr
Posté le 20-09-2004 à 17:18:50  profilanswer
 

et si tu utilisé un B-arbre ?

n°854260
Taz
bisounours-codeur
Posté le 20-09-2004 à 17:20:47  profilanswer
 

ça va bouffer de la RAM niveau structure ...

n°854362
LeGreg
Posté le 20-09-2004 à 19:21:44  profilanswer
 

tetsidule a écrit :

les fonctions de mmap sous windows ne me semblent pas franchement portables, et ça va être dur d'utiliser la version native sous unix de mmap, puisque je compile sous windows. connaissez vous des librairies portables (ou tout du moins adaptables sans trop de pb) qui m'aiderait à créer mes mmap maison ?


 
On développe des librairies qui tournent indépendamment
sous Win9x/winNt/win2k/winXp, les différences entre les systemes sont cachées par des #ifdef. Le grand jeu est evidemment de designer le truc pour que le plus de code soit partagé (et limiter les #ifdef aux parties critiques).


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  tableau de 900 000 cases (implosion du pc)

 

Sujets relatifs
Déclaration de la source d'un tableau croisé dyn en VBA **RESOLU**Retourner un tableau d'éléments de type utilisateur
[access] tableau -> listeproblème pour afficher des données dans un tableau
[CSS] Grossir un seul coté d'un tableauGrisage de cases
Lecture tableau associatif complexeTableau Array [JS]
pointer un element d'un tableauIE garder la mise en forme du texte dans un tableau
Plus de sujets relatifs à : tableau de 900 000 cases (implosion du pc)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR