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 :

Manipulation de grands tableaux


Sujet :

C

Vue hybride

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Par défaut Manipulation de grands tableaux
    Bonjour,

    je suis en train de coder une lecture de fichier bloc par bloc. Pour cela j'utilise un tableau de char dans lequel je stoque les blocs les uns après les autres. Les fichiers que je lis font plusieurs Go, donc je voudrais avoir la plus grande taille de tableau possible. J'ai donc commencé avec des lectures par blocs de 500 Mo. Pour la lecture seule cela fonctionne. Mais dès que je commence à manipuler le tableau une erreur de segmentation apparaît. En réduisant la taille du tableau, je me suis aperçu qu'à partir d'environ 5 Mo, le programme tournait. Donc ma question est comment se fait-ce ? et comment puis-je agrandir la taille de mon tableau sans obtenir d'erreur de segmentation ?

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Si tu declares tes tableaux comme variables automatiques, i.e.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char array[ARRAY_LENGTH];
    tu es limite par la taille de la pile qui est de quelques dizaines de Mo. Si tu veux avoir des tableaux plus grands, il faut les allouer sur le tas, via malloc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char *array = malloc(ARRAY_LENGTH);
    if (array != NULL)
    {
       ...
       free(array);
    }
    La limite de la taille d'un segment alloue est celle de la quantite de memoire (y compris virtuelle) disponible et adressable sur la machine.
    Cela etant, l'allocation de gros tableaux (plusieurs centaines de Mo, voire plusieurs Go) doit etre justifiee. Est-il vraiment necessaire de conserver la totalite d'un gros fichier en memoire? En general, non.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Par défaut
    Merci. En l'occurrence je construis un modèle statistique qui implique de gros fichiers et j'ai à disposition une assez bonne machine pour la phase d'apprentissage. Comme ce sont les accès en lecture et écriture qui prennent du temps, je pense qu'utiliser de gros tableaux est justifié. Je compte essayer plusieurs tailles pour comparer experimentalement combien cela accélère le processus et choisir en fonction des résultats.

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

Discussions similaires

  1. Manipulation et Opération tableaux
    Par SAStableau dans le forum SAS STAT
    Réponses: 2
    Dernier message: 26/01/2008, 15h02
  2. [JAVA] Travailler avec de grands tableaux
    Par laulaurent dans le forum Langage
    Réponses: 2
    Dernier message: 07/06/2007, 13h05
  3. manipuler de grandes listes
    Par yarf dans le forum Langage
    Réponses: 7
    Dernier message: 12/02/2007, 16h45
  4. manipuler des grands nombres
    Par Hypnocrate dans le forum C
    Réponses: 3
    Dernier message: 25/03/2006, 22h27
  5. [Débutant] manipulation de grand nombre
    Par yonderboy dans le forum C
    Réponses: 8
    Dernier message: 18/10/2005, 05h29

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