IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Question sur la mémoire et les fichiers


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Par défaut Question sur la mémoire et les fichiers
    Bonjour,

    J'ai depuis un certains une question que je n'arrive pas à résoudre. J'ai créer un programme de cryptage utilisant l'algorithme XOR. Ce dernier marche parfaitement, petit problème, il ne marche pas sur des fichier très gros de l'ordre du Go.
    Un ami m'a expliqué que lorsqu'on fait "fopen" le fichier est chargé en mémoire.

    Je me demandais donc s'il y avait une possibilité de gérer des fichiers de plusieurs Go. J'ai pensé à séparer le fichier en plusieurs parties mais ça ne résout pas le fait que le fichier est quand meme chargé en memoire.

    Je sollicite donc votre aide

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je ne sais pas s'il n'y a pas une limitation avec fopen sur la taille du fichier (dans le genre pas plus de 2 GO).

    Autre piste, si tu es sous Microsoft, tu as MapViewOfFile() qui permet de mapper un fichier dans l'espace mémoire du process et qui est assez performant. Le fichier est mappé dans l'espace mémoire et les pages sont allouées par le système dès que tu accèdes aux différentes parties du fichier. Bien sûr, cela ne vaut que pour Microsoft, pour linux, regarde du côté de mmap()
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Par défaut
    Bonjour, je crois que la limitation pour fopen est celle de la memoire. Cependant j'avoue que j'ai quelques difficultées de comprehension. Tout d'abord que signifie "mapper" ? J'ai fait une recherche et la definition serait "faire correspondre un lien entre deux elements."

    Dans le man du MapViewOfFile je ne comprends pas les parametres dwFileOffsetHigh et dwFileOffsetlow.

    Je pense ne pas avoir le niveau nécessaire pour utiliser cette fonction.. Je n'ai jamais utiliser l'api win32... Y a t-il un tutoriel complet la dessus ?*

    Edit : Pourquoi le descripteur du fichier dans mmap est de type int ? Ca ne devrait pas etre un pointeur vers le fichier ?

    Est-ce que le fait de charger le fichier dans le processeur ne pose pas de probleme ? Celui-ci possedant moins de memoire deevrait etre vite saturé...

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Bonsoir,

    « mapper », ou tout au moins « mappe » sont tout-à-fait français, proviennent de mappa : nappe, et consistent, d'une manière générale, en l'application d'une surface en deux dimensions (comme une feuille de papier) sur un support solide ou un volume en trois dimensions. La « 3D mappée », par exemple, consiste à coller une ou plusieurs textures sur un volume fait de polygones. Une mappemonde est une représentation de la carte du monde sur une sphère.

    En programmation, « mapper un fichier » consiste à projeter son image intégrale en mémoire. Il n'y a plus de lecture explicite avec chargement d'un tronçon du fichier de taille fixe et à un emplacement donné, ni de fopen() ou fclose(). Tu passes le nom du fichier à projeter à l'appel système consacré, et celui-ci te retourne un pointeur sur le début du fichier.

    Le système te fait donc croire qu'il est entièrement chargé en mémoire, ce qui n'est pas le cas. Les « pages » correspondant aux parties du fichier que tu lis sont chargées en temps réel au moment tu y accèdes en utilisant exactement les mêmes mécanismes que pour la mémoire swap. Ça peut marcher dans l'autre sens aussi : tu peux demander au système d'enregistrer automatiquement les modifs que tu fais. En fait, tu peux voir le swap comme un fichier mappé anonyme.

    Les avantages sont évidents. Par contre, ça ne fonctionne que sur des fichiers, sur support à accès direct et de préférence en local. Tu auras donc toujours besoin de (f)open et (f)close pour lire des pipes, des lecteurs de bande, des terminaux, des ports série, etc.

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    « mapper », ou tout au moins « mappe » sont tout-à-fait français,
    Je crois qu'il s'agit plutôt d'anglicismes.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par diogene Voir le message
    Je crois qu'il s'agit plutôt d'anglicismes.
    Curieusement, non !

    Le Jargon Français signale qu'il en est fait état dès 1730 ici et ici. J'en ai aussi trouvé trace dans d'autres documents écrits sur lesquels je ne remets plus la main. « mappe » est dans le dictionnaire, et « mappa » est un mot latin.

    Par contre, je suis contre la définition qui stipule « établir une correspondance entre deux choses distinctes ». C'est beaucoup trop imprécis. Un mappage est surtout une projection sur une structure existante, pour en épouser les caractéristiques.

  7. #7
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par Flynet Voir le message
    Un ami m'a expliqué que lorsqu'on fait "fopen" le fichier est chargé en mémoire.
    Quand on fait fopen, on crée simplement une structure en mémoire décrivant le fichier. c'est les instructions de la famille de fread qui chargent en mémoire. Rien ne t'empêche d'ouvrir un fichier en lecture, un deuxième en écriture et de coder/décoder à la volée par petits blocs de l'un vers l'autre. Pas besoin de tout charger en mémoire d'un coup. Si tu te penses obligé de charger en une seule fois ce genre de fichier, il faudrait peut-être revoir la conception de ton soft.

    A+

    Pfeuh

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Par défaut
    Lol merci pour la correction orthographique. Donc une api une liste des fonctions d'autres bibliotheques. Quelles sont les bibliotheques en jeu ?

    Et donc si je comprends c'est fread qui charge le fichier en mémoire et non fopen ? la sa change tout. Je pourrais ouvrir un grand fichier et faire plusieurs fread et fwrite pour résoudre mon probleme.

    Quant à mon code il marche bien, c'était juste un probleme de taille. Vu que je lisais le fichier en une seule fois.

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par Flynet Voir le message
    Et donc si je comprends c'est fread qui charge le fichier en mémoire et non fopen ? la sa change tout. Je pourrais ouvrir un grand fichier et faire plusieurs fread et fwrite pour résoudre mon probleme.
    C'est ce qu'il faut faire. D'habitude, on essaie de ne pas dépasser quelques kilo-octets quand on dimensionne le tampon qui va recevoir les lectures successives de ton fichier. Mais si tu es tout seul sur ta machine et que tu gères de gros fichiers, n'hésite pas à utiliser la mémoire à ta disposition (buffer de plusieurs mégas).

    C'est vrai que les accès disques deviennent plus subtils sur les disques durs et avec les bêtes de courses qui équipent nos salons aujourd'hui. Par contre, essaie de faire la même chose en lisant un fichier sur disquette, si ta machine a toujours un lecteur floppy et, si possible, en désactivant le cache disque. Là, tu vas comprendre pourquoi il vaut mieux optimiser les accès fichiers. :-)

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Par défaut
    Malheuresement je n'en dispose pas sur mon portable. Mais de nos jours les disquettes sont devenues quasiment obsoletes non ?

    Par contre en quoi la taille du buffer compte dans les lectures ? Il me semble que sur certains gestionnaires de copie, il est possible de régler la taille du buffer mais je n'en ai jamais su l'utilité...

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par Flynet Voir le message
    Malheuresement je n'en dispose pas sur mon portable. Mais de nos jours les disquettes sont devenues quasiment obsoletes non ?
    C'était simplement pour te montrer ce qu'est un accès disque avec un support suffisamment lent pour que ce soit perceptible. Quand j'étais jeune, j'avais un MO6 avec un lecteur de cassettes. Un quart d'heure pour charger MGT qui devait faire… quoi ? 40 kilo-octets peut-être :-) Pourtant ce n'est pas de la préhistoire, je l'ai eu en 1987.

    Par contre en quoi la taille du buffer compte dans les lectures ? Il me semble que sur certains gestionnaires de copie, il est possible de régler la taille du buffer mais je n'en ai jamais su l'utilité...
    Aujourd'hui, on exploite principalement un disque dur qui tourne en permanence, avec un système d'exploitation gérant un swap, un cache disque efficace qui délaie les enregistrements sur disque au bon moment de façon transparente pour l'utilisateur, etc. Toutes ces choses finissent par rendre les opérations d'entrées/sorties assez abstraites aux yeux de l'utilisateur alors qu'il devrait encore en tenir compte.

    Les disques durs sont rapides mais ils restent environ mille fois plus lents que de l'accès à la mémoire vive. De toutes façons, c'est dans cette RAM que leurs informations sont chargées. D'autre part, l'ouverture d'un fichier et ses accès ont un coût ! Lire et enregistrer, c'est long et c'est fatiguant pour la mécanique.

    Il est donc tout à ton avantage d'exploiter de travailler au maximum en mémoire, tant que tu le peux, et de tout enregistrer en une fois. Par contre, il est très déconseillé de conserver cette mémoire si ton programme est censé être résident sur ta machine et tourner en tâche de fond.

  12. #12
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 535
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 535
    Par défaut
    Salut,

    Citation Envoyé par Flynet Voir le message
    Un ami m'a expliqué que lorsqu'on fait "fopen" le fichier est chargé en mémoire.
    C'est une erreur !
    A ma connaissance fopen ne fait qu'ouvrir un "handle" c.a.d un descripteur de fichier.

    Citation Envoyé par Flynet Voir le message
    Bon apres toutes ces modifs j'ai teste de nouveau sur un fichier de 1,7 go environ sur une machine equipee de xp avec 2 go de ram et ca marche !
    Le cryptage par contre est un peu lent (2 mn deja passe et encore en train de crypter)...
    je déconseille d'utiliser les fonction standards du C tu ne pourras pas décider d'une stratégie de gestion de mémoire.
    Il vaut mieux utiliser les API win32 comme GlobalAlloc,VirtualAlloc() etc...


    edit : et serait-il possible de diminuer le temps de cryptage ? un fichier de 700 mo prend deja plusieurs minutes...

    Merci de ton aide !
    C'est une autre problématique: sous Windows il vaut mieux passer à la programmation en multithreading...
    en win32 par exemple tu peux définir sur quel CPU peut tourner un thread et faire du traitement en parallèle sur un n core ce qui peut optimiser le programme et le faire tourner plus rapidement.
    Visual Studio 2010 intégre la programmation parallèle et des directives de précompilation pour cela.

    Maintenant avant de sortir la grosse artillerie , peut-être il y a t-il des optimisations et des goulots d'étranglements dans ton code il faut utiliser un "Profiler" au besoin..

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Par défaut
    Je ne connais malheuresement pas encore les api et en ce qui concerne le multi-threading non plus. Lequel me conseilles-tu de commencer avec ?
    Même si pour l'instant j'utilise codeblocks, je peux toujours me mettre a la programmation en parallele ?

    Et qu'appelles-tu "profiler" ?

    Et je reprends pour getch, comment enlever l'avertissement et avoir un code portable ?

    merci

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Pour que le programme attende la frappe d'une touche de clavier, l'instruction
    est aussi peu portable que getch(), mais un peu plus jolie.
    Pour tester la frappe d'une touche sous UNIX, il y a eu dernièrement ce sujet qui l'a largement traité http://www.developpez.net/forums/d94...ue-lexecution/
    Cordialement.

  15. #15
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 535
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 535
    Par défaut
    Citation Envoyé par Flynet Voir le message
    Je ne connais malheuresement pas encore les api et en ce qui concerne le multi-threading non plus. Lequel me conseilles-tu de commencer avec ?
    Même si pour l'instant j'utilise codeblocks, je peux toujours me mettre a la programmation en parallele ?
    Aie cela va être dur !
    oui si codeblocks supporte les API win32 aucun problème pour faire de la programmation parallèle..
    mais ce sera au niveau API win32 seulement pas au niveau de l'optimisation du code.
    Pour obtenir des blocs de code optimisés il faut avoir recours à Thread Building blocks d'Intel par exemple qui est Open Source je crois ( mais qui ne fonctionne qu'avec les CPU Intel évidemment ).

    Mais le plus simple c'est d'utiliser une bibliothèque comme pthread qui est portable

    Et qu'appelles-tu "profiler" ?
    un profiler c'est une fonctionnalité du compilateur : en exécution tu peux inspecter une ou des fonctions et voir le temps d'exécution qu'elles mettent pour faire un traitement.
    Voir l'aide de CodeBlocks
    Mais je te conseille d'essayer d'optimiser ton code avant : éviter les boucles imbriquées par exemple

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Questions sur la compatibilité et les version de VB
    Par jam92400 dans le forum Discussions diverses
    Réponses: 22
    Dernier message: 08/04/2008, 16h19
  2. Question sur firefox/mémoire
    Par Nemesys dans le forum Windows XP
    Réponses: 3
    Dernier message: 21/08/2006, 10h23
  3. Recoder malloc -> Questions sur la mémoire
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 15/03/2006, 18h11
  4. [Hardware] questions sur la mémoire virtuelle
    Par Irae dans le forum Composants
    Réponses: 22
    Dernier message: 04/10/2005, 12h41
  5. Quelques questions sur la mémoire
    Par Gruik dans le forum C
    Réponses: 6
    Dernier message: 17/11/2004, 14h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo