none
sauvegarde de variable sur le disque dur RRS feed

  • Question

  • Bonjour,

    J'ai besoin de sauvegarder des variables dans des fichiers (ou sous une autre forme de sorte que je pourrais les récupérées) sur mon disque dur afin de les utilisées plutard.

    exemple:

    j'ai une matrice de type :

    int [,,] matrice=new int[1024,1024,1000];

    cette matrice je l'ai obtenu après un long traitement (ça dure des heures) alorsje veut sauvegarder cette matrice dans un fichier pour la récupérée plutard et ne pas refaire le traitement de le début.

     

    Est ce que quelqu'un a une idée sur la réponse?

    Merci d'avance.

     

    mardi 15 avril 2008 10:40

Toutes les réponses

  • Peut être c'est bête mais :

     

     

    Si tu regex pour récuperer ta variable, tu créé un fichier txt et l'inscris dedans. Par la suite tu n'auras plus qu'a ouvrir le fichier et recuperer la ligne non?

     

    mardi 15 avril 2008 10:44
  • Un sujet très intéressant que la sérialisation d'objet te sera grandement utile ici. Je l'utilise assez souvent et notamment dans des cas comme celui ci.

     

    La sérialisation te permet de sauvegarder l'état d'un objet.

    Je vais faire au plus simple.

     

    Imagine que tu simplifie ton objet point (x,y,profondeur) comme ceci:

    Code Snippet

    public class Coordinates

    {

    private int _x;

    public int X

    {

    get { return _x; }

    set { _x = value; }

    }

    private int _y;

    public int Y

    {

    get { return _y; }

    set { _y = value; }

    }

    private int _prof;

    public int Prof

    {

    get { return _prof; }

    set { _prof = value; }

    }

    public Coordinates(int x, int y, int prof)

    {

    X = x;

    Y = y;

    Prof = prof;

    }

    public Coordinates()

    {

    }

    }

     

     

    Ensuite tu transformes ta matrice pour créer une liste de point. Ensuite tu n'as plus qu'à sauvegarder. Je te mets ci-dessous un exemple de sauvegarde en ayant créé 2 points:

    Code Snippet

    List<Coordinates> matrice = new List<Coordinates>();

    matrice.Add(new Coordinates(0, 0, 1));

    matrice.Add(new Coordinates(0, 0, 2));

    FileStream fs = new FileStream(@"c:\temp\Matrix.xml", FileMode.Create);

    XmlSerializer xs = new XmlSerializer(typeof(List<Coordinates>));

    xs.Serialize(fs, matrice);

    fs.Close();

     

     

    n'oublie pas le

    using System.Xml.Serialization;

     

    Question: pourquoi ne pas directement sérialiser la matrice et non pas une liste?

    Je t'avoue ne pas pouvoir te faire une réponse sure à 100%

    A priori j'ai fait un essai et ça ne marche pas mais j'ai été assez vite je l'avoue.

    Je crois que tout dépend en fait du type que tu sérializes: il ne sait sérializer que des types simples (y a une liste qui traine dans la référence mais j'ai plus le lien sous la main)

     

    pour relire les données tu fait comme suit:

    List<Coordinates> = (List<Coordinates>xs.Deserialize(fs);

     

    Dans cet exemple je sauvegarde en xml car c'est très simple il suffit de respecter les règles suivantes:

    - mettre la classe publique

    - créer des propriétés pour chacun des éléments sérializables

    - créer un constructeur public sans paramètres

     

    La sérialisation est plus vaste et tu peux sauvegarder en binaire (utile pour sauver une image)

     

    Voila je n'ai fait qu'effleurer le sujet mais c'est vraiment la solution idéale pour sauvegarder des données "live"

    mardi 15 avril 2008 11:35
  • en fait, je trouve que votre idée de sérialization n'est pas mal. Sauf que je n'ai pas une seule matrice à sauvegarder, j'en ai des milliers.

    Pensez vous que malgré le grand nombre de matrice à sauvegarder, cette méthode de sérialization demeure la meilleure?

    mardi 15 avril 2008 12:14
  • Bonjour,

    Vous pouvez aussi écrire vous même les données au format binaire dans un fichier. Voila un exemple d'écriture et de lecture :

     

    Code Snippet

    public void WriteMatrixToFile(string fileName, int[, ,] matrix)

    {

    // on ouvre le fichier

    using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))

    {

    // on crée un objet nous permettant d'écrire en binaire

    using (BinaryWriter bw = new BinaryWriter(fs))

    {

    // on sauve la taille ses dimensions

    bw.Write(matrix.GetLength(0));

    bw.Write(matrix.GetLength(1));

    bw.Write(matrix.GetLength(2));

     

    // on sauve les valeurs

    for (int i = 0; i < matrix.GetLength(0); ++i)

    {

    for (int j = 0; j < matrix.GetLength(1); ++j)

    {

    for (int k = 0; k < matrix.GetLength(2); ++k)

    {

    bw.Write(matrix[i, j, k]);

    }

    }

    }

    }

    }

    }

     

    public int[, ,] ReadMatrixFromFile(string fileName)

    {

    // matrice local

    int[, ,] matrix = null;

     

    // on ouvre le fichier

    using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))

    {

    // on crée un objet nous permettant de lire en binaire

    using (BinaryReader br = new BinaryReader(fs))

    {

    // on lit les dimensions

    int d1 = br.ReadInt32();

    int d2 = br.ReadInt32();

    int d3 = br.ReadInt32();

     

    // on crée la matrice et on lit les valeurs

    matrix = new int[d1, d2, d3];

     

    for (int i = 0; i < d1; ++i)

    {

    for (int j = 0; j < d2; ++j)

    {

    for (int k = 0; k < d3; ++k)

    {

    matrix[i,j,k] = br.ReadInt32();

    }

    }

    }

    }

    }

     

    // on retourne la matrice

    return matrix;

    }

     

     

     

    mardi 15 avril 2008 13:53
  • J'allais te proposer aussi cette solution ... Grilled! Merci Guillaume.

     

    Plus sérieusement tout dépendra en fait du remplissage de ta matrice. Si chacune des cases de la matrice est remplie, fonce sans hésiter sur la solution de Guillaume; par contre si la totalité n'est pas remplie (je pense que c'est significatif avec 1/4) il vaut mieux construire un "nuage de point" avec ine liste comme je te l'ai indiqué. Au passage j'ai oublié une vairable dans ma classe (la valeur )

     

     

     

    mercredi 16 avril 2008 07:01