Sauvegarde données en binaire

freeman151248 Messages postés 16 Date d'inscription vendredi 19 mai 2006 Statut Membre Dernière intervention 31 mars 2011 - 8 févr. 2008 à 10:55
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 15 févr. 2008 à 09:38
Bonjour,

je souhaite sauvegarder un nombre de données assez important, donc en binaire pour ne pas avoir de taille de fichier trop lourde. Mais je n'arrive pas a trouver la solution. J'ai déja sauvegardé des données en random mais la a priori ca ne marche pas. voici un peu mon projet .

J'ai créer 2 TYPE perso :
1. ce type contient des données que j'ai récupérer d'un fichier texte. les tableaux Spectrexxxx peuvent être de forme variable sur la 1ere dimension ex: spectredB(4096,2) ou spectredB(32,2) etc.....

Public Type FichierSortieIcare
    Configuration As String
    Comment As String
    NomFichier As String
    NombreDeFrequence As Double
    NomSource As String
    SourceComment As String
    CoorSourceX As String
    CoorSourceY As String
    CoorSourceZ As String
    NomRecepteur As String
    RecepteurComment As String
    NomPanneau As String
    CoorRecepX As String
    CoorRecepY As String
    CoorRecepZ As String
    SpectreRe() As Double
    SpectreIm() As Double
    SpectredB() As Double
End Type
2.Le deuxième est une sorte de base données contenant un nombre variable de données de type FichierSortieIcare.Transferts est un tableau 1 dimension.

Public Type BaseDeDonnee
    Nom As String
    Commentaire As String
    IsEmpty As Boolean
    NombreTransferts As Integer
    Transferts() As FichierSortieIcare
End Type
dim BDDProjet as BaseDeDonnee

Je souhaite donc sauvegarder BDDProjet dans un fichier. J'ai essayé avec RANDOM mais cela génére des erreurs, car si j'ai bien compris il faut des tailles fixes et je n'ai pas de taille fixe!

comment puis-je stocker ces données et les relire correctement? car si je stocke en texte je pense que pour un nombre de Transfert=729 (en moyenne le nombre de données d'un projet) j'aurai un fichier de 550Mo.

merci de votre aide ou conseil!

4 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 févr. 2008 à 01:13
Salut
Plusieurs problèmes :
Taille des fichiers :
Que tu stockes en Random ou autre, les données prendront a peu près la même place.
Donc, la méthode n'y changera pas grand chose excepté pour les chiffres qui peuvent être stockés sur peu d'octets.
Pour gagner de la place, il va falloir passer par des algos de compression.

La méthode :
En effet, des variables typées avec des chaines String non délimitées (*) n'ont pas de taille fixe, donc non utilisables pour un accès direct par Random.
(*) String de taille fixe avec la définition    maChaine As String * 10  pour une chaine de 10 caractères.
Là, avec des chaines de longueur connue, l'accès Random est possible

La question est : As-tu besoin d'un accès Random ?
As-tu besoin de ces données au démarrage de ton application ou bien dois-tu les lire n'importe quand et pas toutes en même temps ?
Si tu dois les charger en une seule fois, tu peux te rabattre sur un fichier texte avec une donnée par ligne ou une ligne par variable typée en séparant les données par un caractère spécial, genre le  |
Je vois que ta structure comporte aussi des tableaux :
Là, ça complique tout puisqu'il faut, en plus de stocker les données, les rattacher à une autre structure.

Rien que pour cela, je te suggère fortement de te pencher sur les bases de données et de remplacer / alimenter tes variables typées par des questionnements de la DB (RecordSet)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés





<hr />

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
freeman151248 Messages postés 16 Date d'inscription vendredi 19 mai 2006 Statut Membre Dernière intervention 31 mars 2011
9 févr. 2008 à 15:15
salut jack,


merci pour ta réponse.
-j'étais parti sur un accés RANDOM mais effectivement, je n'en ai pas besoin car les données du fichier sont ttes appelées à l'ouverture de l'appli.
 
-En fait, je voulais utilisé uniquement cela pour que la structure en type personnalisé soit reconnue lors de la lecture du fichier.En effet, je pensais que la sauvegarde en RANDOM était la seule manière de garder en mémoire cette structure personnalisée mais en sauvegardant en BINARY, la structure est reconnue donc finalement mon problème est résolu.

-Je n'ai pas essayé de sauvegarder en ASCII mais j'ai 2 soucis :
1.J'ai peur que la taille du fichier soit énorme :
Par exemple 1 fichier lu et mis en données de TYPE FichiersortieICARE fait 732Ko or la taille moyenne de ses fichiers stockés en BDDProjet est de 1000 donc je pense qu'en multipliant les 2 j'ai a peu pres la taille globale de la BDDProjet soit 732Mo. Le binaire est intéressant car la plupart des données sont des DOUBLE.
2. Je ne pense pas que la lecture du fichier soit aussi facile:
  Pas de reconnaissance de TYPE perso?

-Sur tes conseils je vai zieuter du coté des algos de compression juste pour voir  pour la suite de mes aventures en VB.

-pour finir voila ce que je fais ds mon appli.
G un peu changé ma structure perso :
Public Type BaseDeDonnee
    Nom As String
    Commentaire As String
    IsEmpty As Boolean
    NombreTransferts As Integer
End Type
public Transferts() As FichierSortieIcare
public BDDProjet as BaseDeDonnee

pour la sauvegarde (en résumé) :
open FilePath for BINARY as  #Num
put #Num,,BDDProjet


for i= 1 to BDDProjet.NombreTransferts


   put #Num,,Transferts(i)
next i



po ur la lecture(en résumé) :

open FilePath for BINARY as  #Num
get #Num,,BDDProjet
redim Transferts(BDDProjet.NombreTransferts)


for i =1 to BDDProjet.NombreTransferts


   get #Num,,Transferts(i)
next i


Merci encore
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
15 févr. 2008 à 09:34
Salut
Non, tu ne peux pas utiliser cette technique d'écriture/lecture car Transferts n'a pas de taille fixe.
Pour que cela fonctionne, il faut impérativement dimensionner tes chaines en longueur fixe comme ceci :
   Nom As String * 32
A toi de voir quelle taille adopter, mais, côté taille de fichier, cela ne va pas aller dans le bon sens puisque tu vas être obligé de stocker les espaces de terminaison.

Je t'assure que l'utilisation d'une DB genre Access et d'une connexion ADODB depuis VB6 n'est pas insurmontable et résoudrait tes problèmes.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés





<hr />

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
15 févr. 2008 à 09:38
Oups
J'ai confondu Transferts avec BaseDeDonnee, mais la reflexion reste la même : Tu ne pourras pas relire efficacement BaseDeDonnee en tête de ton fichier pour les raisons mensionnées. Idem pour les fiches FichierSortieIcare.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Rejoignez-nous