yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 2009
-
31 mars 2007 à 18:44
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 2009
-
2 avril 2007 à 17:07
Bonjour à tous !
Comme le titre l'indique, j'ai un petit souci avec l'allocation de mémoire.
En fait j'ai un char*, auquel j'applique un malloc. Ensuite, la taille des données devant être contenues dans le char* n'est pas connue d'avance. J'ai donc pensé à utiliser realloc pour augmenter la taille mémoire. Seulement, de temps en temps, le realloc ne semble pas pouvoir allouer assez de mémoire. Ceci me provoqe alors une erreur.
Connaitriez-vous une fonction ou une technique pour arriver à allouer de nouveau un bloc mémoire sans être rapidement limité (< 10 Mo) ?
Merci d'avance pour votre aide.
PS : si vous souhaitez des détaills, n'hésitez pas !
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 1 avril 2007 à 17:12
Ah bon j'ai cru que tu faisais un taitement du contenu des fichiers.
Dans ce cas, pourquoi n'utilises-tu pas une structure de données chainée pour stocker les noms de fichiers?
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 1 avril 2007 à 11:02
Merci SAKingdom pour la fonction, c'est sympa !
Il n'y a pas d'autre(s) moyen(s) afin d'éviter des memcpy ? Parce que si mem fait quelques Mo (ce qui peut arriver), ça risque d'être un peu long non ?
PS : pour l'instant, ma technique est d'utiliser un fichier (et ça fonctionne bien) mais il faudrait que j'arrive à faire le travail en interne du programme.
cs_Matt67
Messages postés549Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention 6 mars 20103 1 avril 2007 à 15:02
Bonjour,
j'aime bien le "de temps en temps". C'est a dire que tu realloues plusieurs fois de la memoire dans ton programme et, de temps en temps, ca plante ou alors tu lances plusieurs fois ton programme et, de temps en temps, ca plante ?
Tu realloues comment au maximum (environ) ?
Peut-être qu'un bout de code.
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 1 avril 2007 à 15:33
En fait, c'est pour créer une arborescence de dossiers/fichiers. J'utilise donc un code récursif. La taille de l'arborescence est donc aléatoire.
Voilà une explication du code (un peu long) :
Du coup, à l'initialisation j'alloue avec malloc() pour mettre le dossier de départ de l'arborescence. Ensuite à chaque fois que je vais ajouter un fichier ou un dossier à l'arborescence, je fais un realloc(buffer, taille_arborescence + 1000);
Selon ce qui a été ajouté je fais : taille_arborescence += nombre_d'_octets_écrits;
Et ainsi de suite avec la récursivité.
J'ai essayé une autre façon, en faisant un realloc() uniquement quand c'est nécessaire :
if(_msize(Arborescence) < *TailleArb + 1000) Arborescence = (char*)realloc(Arborescence, *TailleArb + 1048576);
J'augmente la taille du bloc mémoire d'1 Mo à chaque fois que sa taille devient limite insuffisante.
Et visiblement ça à l'air de passer comme ça.
Qu'en pensez-vous ?
PS à Matt67 : le programme plante pour certaines arborescences et pas pour d'autres.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 1 avril 2007 à 15:41
Ton arborescence elle existe (ce sont des fichiers/dossiers qui sont sur le disque) ? Si oui, pourquoi ne pas compter tout ça avant d'allouer ? Tu aurais la somme exacte de mémoire nécessaire et pas de memcpy ou de realloc.
C++ (@++)<!--
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 1 avril 2007 à 15:46
Oui elle existe. J'ai déjà pensé à calculer la taille avant, mais avec de grosses arborescences ça risque de mettre un peu de temps je pense (?). Donc je préfère faire le boulot (parcourir les dossiers) une seule fois si possible.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 1 avril 2007 à 16:16
Pour ce genre de choses je fais un seul parcours. Pendant le parcours tu remplis une liste (par exemple) contenant les fichiers et en même temps tu calcules la taille totale. Du coup plus besoin de reparcourir ton arborescence puisque tu as ta liste.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 1 avril 2007 à 16:18
SAKingdom> Ca pourrait être plus lent de refaire un parcours de l'arborescence, par exemple si le dossier à parcourir est situé sur un lecteur réseau et que le débit est lent.
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 1 avril 2007 à 16:30
Vecchio56 tu peux m'en dire un peu plus sur le terme "liste" stp ?
Parce que moi c'est déjà ce que je fais de lister les noms des fichiers et dossiers pendant le parcours.
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 1 avril 2007 à 17:18
Ah oui les listes chainées ! Je me rappelle avoir déjà vu ça en cours d'algo. On a jamais fait en pratique. Je crois que ça va être l'occasion de s'y lancer !
J'ai du boulot qui m'attend je crois....zou je file !
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 2 avril 2007 à 17:07
Bonne nouvelle ! J'ai réussi à m'en sortir. Et tout ça grâce aux listes chainées. Comme quoi les cours ça sert desfois.
Un grand merci à vous tous pour m'avoir aidé et merci vecchio56 pour m'avoir trouvé cette petite idée qui a fait toute la différence.