Résultats de 1 à 10 sur 10

Sujet : Ouvrir un gros fichier txt avec la RAM

  1. #1

    Ouvrir un gros fichier txt avec la RAM

    Bonjour,
    J\'ai des traitements en C à effectuer sur un gros fichiers .txt pour que ca soit plus rapide je voudrais l\'ouvrir en RAM ( même s\'il faut le découper), comment faire?:?:
    Comment peut on tester la RAM disponible?:?:
    Merci.

  2. #2
    Membre MP
    Inscrit
    août 2013
    Messages
    665
    Lors de l\'execution du prog, tout le code, les données(variables), pile d\'execution se trouvent dans la RAM. Si il n\'y a plus assez de place, le système d\'exploitation fout le reste des données dans la mémoire virtuelle (un espace disque dur alloué par celui ci pour ce genre de problème).
    Donc pour ton problème, il suffit dans un prog c, d\'ouvrir le fichier et de lire le contenu en le plaçant dans un tableau de caractères.
    Les fonctions fopen et fclose font office de lien entre le disque dur et la ram si tu veux.
    J\'espère que ça te sera suffisant.
    Je te souhaite pas bonne chance(la chance c\'est pour les nuls) mais bon courage. :wink:
    [col=#FFDD1A]( [/col][col=#FF0000]B[/col]e [col=#FF0000]S[/col]i[col=#FF0000]d[/col]e [col=#FFDD1A])[/col]

  3. #3
    Merci pour la reponse.
    Mais il n\'y aurait pas une fonction pour tester la RAM.
    Je pensais uitiliser la fonction fread pour tout lire d\'un coup mais j\'ai des problemes faire coincider ce resultat avec mes structures.

  4. #4
    Membre MP
    Inscrit
    août 2013
    Messages
    6 517
    Je ne comprends pas bien ta demande.
    Tu peux faire simplement :
    Code:
    FILE* p_fichier;
        p_fichier = fopen(\"sauver.don\",\"r\");
    avec sauver.don le nom du fichier, r pour lecture seule.
    Après pour recuperer les données du fichier, tu as les commandes fscanf, getc, fgets, fread, et surement d\'autres.
    Une fois le fichier ouvert, quand tu recuperes les données, elles sont forcement dans la RAM.
    Je ne vois pas ou tu veux dire que ce n\'est pas executé dans la RAM et quel est le pb, quelle taille fait ton fichier ?
    Lisez la charte, pensez à regarder la FAQ, les tutoriaux, l'annuaire et faites une recherche dans les forums.
    N'oubliez pas le Tag [Résolu]http://www.ressources.moteurprog.com...rum/Resolu.gif.

    Initiez-vous à Delphi avec Turbo Delphi Explorer, au C ou au C++ avec Code::Blocks et C# avec Visual C# 2005 Express.

  5. #5
    J\'ai un fichier texte avec quelques de dizaines de milliers de ligne et j\'aimerais remplir mes structures pour pouvoir effectuer des traitements.Pour eviter d\'avoir a faire des acces disques à chaque fois ligne à ligne, je voulais tout mettre en RAM et faire mes traitements pour des questions de rapidité.
    Merci

  6. #6
    Membre MP
    Inscrit
    août 2013
    Messages
    1 823
    Il faudrai que tu commence par alouer de la mémoire :

    voir malloc pour l\'alocation et free pour la libération. ( tu as un pointeur en retour)

    Ensuite il te faux ecrire ce que tu lis dans le fichier dans cette zone mémoire.

    La tu as les fonctions citées plus haut.

    et ensuite tu peux avoir a bouger tes zones memoires, comparer etc :

    memccpy, memcmp, memicmp etc ...

    j\'ai déjà eu un prob similaire au tient ou il falais que je recherche des mots dans un brouillard de 600000 caractère, et le traitement en mémoire était plus de 1000 fois plus rapide que des acces disque. :wink:

  7. #7
    Merci pour ta reponse.

    Y a t\'il une fonction pour connaitre la taille de l\'espace memoire disponible?Suffit il d\'allouer la taille du fichier à traiter pour etre tranquille?
    Je suis un peu à la rue alors tout éclairage supplémentaire est plus que bienvenue. :8O:

  8. #8
    Membre MP
    Inscrit
    août 2013
    Messages
    1 823
    malloc aloue de la memoire entre l\'espace de pile et l\'espace de données du prgm (sur le Heap)
    le maximum de memoire alouable est de 64 Ko si ton prgm n\'utilise pas de données et que la pile est reduite a zero (pas possible) donc la limite se situe en dessous des 64 Ko.

    Pour contourner ce problème, il faux utiliser farmalloc :

    #include <alloc.h>
    void far *farmalloc(unsigned lon nombre_octets);

    le pointeur retourné sera donc de type far. (penser farfree pour la liberation de la memoire)

    pour ce qui est de la disponiblité de la memoire ou de sa taille (qui representent la même preocupation pour ton prgm)

    essaie de le gérer de la façon suivante :

    Code:
    #include <stdio.h>
    #include <alloc.h>
    
    void main (void)
    {
       char far *oct;
    
       if ((oct = (char *) farmalloc (taille désirée)))
          printf(\"Ok\");
       else
          printf(\"Pas assez de mémoire ou erreur alocation\");
    }
    pour changer la taille du bloc aloué en cour de route (augmentation et reduction)

    void *realloc(void *bloc, size_t taille);
    *bloc -> pointeur obtenu par l\'alocation.

    Code:
    #include <stdio.h>
    #include <alloc.h>
    
    void main (void)
    {
       char far *oct;
       char far *Newoct;
    
       if ((oct = (char *) farmalloc (taille désirée)))
          if ((Newoct = (char *) realloc(oct,nouvelle taille désirée)))
              printf(\"Ok\");
          else
                    printf(\"Pas assez de mémoire ou erreur realocation\");
       else
          printf(\"Pas assez de mémoire ou erreur alocation\");
    }
    :wink:

  9. #9
    Merci je vais eesayer de voir ce que je peux faire avec tes renseignements.
    Crois tu que la fonction mmap peut m\'etre utile?:?:
    a+ et encore merci

  10. #10
    Membre MP
    Inscrit
    août 2013
    Messages
    665
    Pas mal la fonction farmalloc, j\'avais pas compris ça dans la question de loopingo, désolé.
    malloc limité? Maintenant je comprends mieux pourquoi le fichier 3DS est limité à 65 536 polygones.
    Sympa pour l\'explication détaillée avec les sources. :wink:
    [col=#FFDD1A]( [/col][col=#FF0000]B[/col]e [col=#FF0000]S[/col]i[col=#FF0000]d[/col]e [col=#FFDD1A])[/col]

Informations du sujet

Utilisateur(s) parcourant ce sujet

il y a actuellement 1 utilisateur(s) parcourant ce sujet. (0 membre(s) et 1 visiteur(s))

Règles des messages

  • Vous ne pouvez pas créer de sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas importer de fichiers joints
  • Vous ne pouvez pas éditer vos messages
  •  
  • Les BB codes sont Activés
  • Les Smileys sont Activés
  • Le BB code [IMG] est Activé
  • Le code [VIDEO] est Activé
  • Le code HTML est Désactivé