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 :

Trop de Realloc


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Trop de Realloc
    Bonjour,

    J'ai un souci, je fais un parcours de fichiers, et j'insert des elt dans un tableau, a chaque insert je fais un realloc pour agrandir mon tableau de pointeur sur une structure.

    Cela fonctionne bien mais au bout de plusieurs dizaines de millions d'elt realloc me renvoi NULL ( Gestionnaires des taches pour ce que ca vaut me dit que j'ai encore de la mem dispo ).

    Si il n'y avait que ce je dirai juste que ca ne supporte pas la volumétrie MAIS si je fais un realloc de 500 elt de mon tableau tout les 500 elt inserés ( donc je fais 500 fois moins de realloc mais a chaque fois j'alloue bcp plus ) je peux traiter cette volumétrie !

    Le fait de faire énormément de realloc a la suite poserait il un soucis ( memoire initiale mal libérée ) ?

    Si quelqu'un peut m'éclairer !

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par tissot
    Bonjour,

    J'ai un souci, je fais un parcours de fichiers, et j'insert des elt dans un tableau, a chaque insert je fais un realloc pour agrandir mon tableau de pointeur sur une structure.

    Cela fonctionne bien mais au bout de plusieurs dizaines de millions d'elt realloc me renvoi NULL ( Gestionnaires des taches pour ce que ca vaut me dit que j'ai encore de la mem dispo ).

    Si il n'y avait que ce je dirai juste que ca ne supporte pas la volumétrie MAIS si je fais un realloc de 500 elt de mon tableau tout les 500 elt inserés ( donc je fais 500 fois moins de realloc mais a chaque fois j'alloue bcp plus ) je peux traiter cette volumétrie !

    Le fait de faire énormément de realloc a la suite poserait il un soucis ( memoire initiale mal libérée ) ?

    Si quelqu'un peut m'éclairer !
    A part pour une question de curiosité, si ça marche avec 500 pourquoi veux-tu le faire fonctionner avec 1?

    Mais sinon, l'implémentation interne de realloc dépend de beaucoup de choses, il faudrait regarder le code de ta version...

    Ou peut-être que y a un test "si cette fonction est trop appelé, rend NULL qu'il arrête de nous embêter..."

    Jc

  3. #3
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    La technique est de doubler a chaque fois la taille de ton tableau.

    realloc cmal
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  4. #4
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Comment realloc peut te renvoyer quelque chose, si il est censé retourné void ?
    K

  5. #5
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Autre question : ne peux-tu pas directement connaitre la volumétrie de ton tableau, au lieu de faire des realloc à chaque fois ? Ca serait beaucoup plus efficace de faire l'allocation en amont, si tu peux.
    K

  6. #6
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par tissot
    Le fait de faire énormément de realloc a la suite poserait il un soucis ?
    Oui, la memoire se fragmente et realloc() ne peut trouver de blocs contigus assez grands (note: cela depend evidemment du systeme et de l'implementation de realloc. Certaines implementations ou gestionnaires de memoire sont suffisamment sophistiques pour traiter ce probleme).
    De toute facon, faire un realloc() a chaque insertion est ultra-non performant. En general, on double la taille du tableau des qu'il est trop petit pour accueillir un nouvel element.

  7. #7
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par KiLVaiDeN
    Comment realloc peut te renvoyer quelque chose, si il est censé retourné void ?
    realloc() ne retourne pas void, mais void *. Et ca fait toute la difference...

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par fearyourself
    A part pour une question de curiosité, si ça marche avec 500 pourquoi veux-tu le faire fonctionner avec 1?

    Mais sinon, l'implémentation interne de realloc dépend de beaucoup de choses, il faudrait regarder le code de ta version...

    Ou peut-être que y a un test "si cette fonction est trop appelé, rend NULL qu'il arrête de nous embêter..."

    Jc
    Ca je n'aime pas ce qui fonctionne sans savoir pourquoi !

    Merci pour ces rep. Peut etre que mon WinXp y est pour quelque chose aussi !

  9. #9
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Citation Envoyé par DaZumba
    realloc() ne retourne pas void, mais void *. Et ca fait toute la difference...
    le genre de truc évident, masqué par mon code d'allocation/reallocation que j'avais oublié !

    Evident qu'il ne retourne pas void.............
    K

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par KiLVaiDeN
    Comment realloc peut te renvoyer quelque chose, si il est censé retourné void ?
    Keskidi ?
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Keskidi ?
    Dekonri !
    K

Discussions similaires

  1. chaine trop longue pour envoyer en socket?
    Par jeje.r dans le forum C++Builder
    Réponses: 10
    Dernier message: 27/06/2003, 16h36
  2. Surface trop grande
    Par Black_Daimond dans le forum DirectX
    Réponses: 1
    Dernier message: 18/01/2003, 03h02
  3. Réponses: 4
    Dernier message: 03/12/2002, 16h47
  4. Arrêter un prog si temps de connexion trop long
    Par jakouz dans le forum Langage
    Réponses: 4
    Dernier message: 22/10/2002, 18h28

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