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 :

Arriver à traiter 1 Million de données


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    sous marinier
    Inscrit en
    Janvier 2018
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : sous marinier

    Informations forums :
    Inscription : Janvier 2018
    Messages : 37
    Points : 12
    Points
    12
    Par défaut Arriver à traiter 1 Million de données
    Bonjour à tous !

    Mon problème est de pouvoir traiter au moins un million de tirage actuel avec le programme qui suit,

    pour être aussi clair que possible, pouvoir rentrer 1 Million de sequence de 9 tirages à mon programme sans qu'il bug.

    En effet, jusqu'ici, il peut traiter 100 000 tirages max, mais une erreur survient quand je veux un tirage de 1M :

    Process terminated with status -1073741819

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    void tri_insertion(int tab[], int taille)
     
    {
     
       int i, j;
     
       for (i = 1; i < taille; ++i) {
     
           int elem = tab[i];
     
           for (j = i; j > 0 && tab[j-1] > elem; j--){
               tab[j] = tab[j-1];
           }
           tab[j] = elem;
     
       }
     
    }
     
    int rand_a_b(int a, int b){
     
        return rand()%(b-a) +a;
     
    }
     
    int* init_sans_doublons(int a, int b)
    {
        int taille = b-a;
     
        int* resultat=malloc((taille)*sizeof (int));
     
        int i=0;
     
        // On remplit le tableau de manière à ce qu'il soit trié
     
        for(i = 0; i< taille; i++){
     
            resultat[i]=i+a;
     
        }
     
        return resultat;
     
    }
     
    void melanger(int* tableau, int taille)
    {
     
        int i=0;
        int nombre_tire=0;
        int temp=0;
     
        for(i = 0; i < taille; i++){
     
            nombre_tire=rand_a_b(0,taille);
     
            // On échange les contenus des cases i et nombre_tire
     
            temp = tableau[i];
     
            tableau[i] = tableau[nombre_tire];
     
            tableau[nombre_tire]=temp;
     
        }
     
    }
     
    int main()
    {
        int a=0, o=0;
        int b=36;
        int i=0, n=0; //evalue la taille des tableaux
        int comptage = 0;
        int* selection=NULL; // Va contenir le tableau de nombres
        int nombreTirage = 0, k = 0, x = 0;
        int comptageSequence = 0;
        int* nbgen = NULL;
        printf("Tapez 42 pour quitter le logiciel\n");
     
        while(1)
        {
     
     
            printf("\nCombien de tirage voulez vous effectuer ?");
            scanf("%d", &nombreTirage);
     
             if(nombreTirage == 42) //Permet de quitter la console lorsque l'utilisateur tape 42
            {
                return 0;
            }
     
             //////////////////CHOIX DE LA SELECTION DE 12 NUMEROS///////////////////////////
     
            while(b<=a);
     
            selection=init_sans_doublons(a,b);
     
            melanger(selection,b-a);
     
            int tabSelection[12];
     
            printf("\nLa selection est : ");
     
            srand(time(NULL));
     
            for(i=0; i<12; i++) //selection reglée sur 12 spins
            {
                printf("%d ",selection[i]);
                tabSelection[i]=selection[i];
            }
     
            printf("\nAvant le tri selection : ");
     
            for(o = 0; o < 12; o++) printf("%d ", tabSelection[o]);
     
            printf("\n");
     
            tri_insertion(tabSelection, 12);
     
            printf("Apres le tri selection: ");
     
            for(o = 0; o < 12; o++) printf("%d ", tabSelection[o]);
     
            printf("\n");
     
            free(selection); // Ne pas oublier de libérer le tableau
     
     
            ///////////////TIRAGE DU NOMBRE DE TIRAGES////////////////////////////
     
            if (nombreTirage > 0)
            {
     
                nbgen = malloc (nombreTirage*sizeof(int));
                if ( nbgen == NULL )
                {
                    perror("Malloc");
                    fprintf(stderr,"Allocation impossible \n");
                    exit(EXIT_FAILURE);
                }
     
                srand(time(NULL));
                n = nombreTirage;
                int tabNbgen[9];
                free(nbgen);// Libération de mémoire
     
                for (k = 0 ; k < n ; k++)
                {
                    printf("Tirage : ");
     
                    for (x = 0 ; x < 9 ; x++)
                    {
                        nbgen[i]=rand()%36+0;    //entre 0-36
                        printf("%d ", nbgen[i]);
                        comptage++;
                        tabNbgen[x]=nbgen[i];
                    }
                    comptageSequence++;    
                    printf("\nAvant le tri tirage: ");
     
                    for(o = 0; o < 9; o++) {
                        printf("%d ", tabNbgen[o]);
                    }
     
                    printf("\n");
     
                    tri_insertion(tabNbgen, 9);
     
                    printf("Apres le tri tirage: ");
     
                    for(o = 0; o < 9; o++)
                    {
                        printf("%d ", tabNbgen[o]);
                    }
     
                    printf("\n");
                }
     
                printf("\nIl y a eu %d tirages, donc %d sequences de 9 \n", comptage, comptageSequence);
            }
        }
    }
    J'ai remplacer tous les int par des long pour essayer, mais rien n'y fait !

    Merci pour vos messages d'aide par avance.

    P1GOU1

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Je suis pas allé plus loin.

  3. #3
    Membre à l'essai
    Homme Profil pro
    sous marinier
    Inscrit en
    Janvier 2018
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : sous marinier

    Informations forums :
    Inscription : Janvier 2018
    Messages : 37
    Points : 12
    Points
    12
    Par défaut
    En effet je l'ai retiré, mais toujours le même résultat hélas...

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Et le problème est où ? À quel endroit le debugger s'arrête pour t'indiquer l'erreur ?
    Parce que ce sont pas les lignes buguées qui semblent manquer...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                free(nbgen);// Libération de mémoire
     
                for (k = 0 ; k < n ; k++)
                {
                    printf("Tirage : ");
     
                    for (x = 0 ; x < 9 ; x++)
                    {
                        nbgen[i]=rand()%36+0;    //entre 0-36
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre à l'essai
    Homme Profil pro
    sous marinier
    Inscrit en
    Janvier 2018
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : sous marinier

    Informations forums :
    Inscription : Janvier 2018
    Messages : 37
    Points : 12
    Points
    12
    Par défaut
    J'ai rectifié avec



    rand()%36;

    et return rand()%(b-a); à la ligne 26


    Et ça marche aussi bien (bon malgré mon problème non réglé). Était ce le seul point que tu reprochais à mon programme en ces lignes bousk ?

    Concernant le débogage, voici la réponse du logiciel ci dessous, je dirais que c'est une erreur de format et que si je change les int en long, cela pourrait marcher cette fois, vous en pensez quoi ?

    Nom : Capture.JPG
Affichages : 114
Taille : 148,8 Ko

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par P1GOU1 Voir le message
    J'ai remplacer tous les int par des long pour essayer, mais rien n'y fait !
    Oui pourquoi pas. Le "int" est garanti faire au-moins 2 octets mais rien ne garantit qu'il en fera 4. Seul le long le permet.
    Mais putain on a vraiment l'impression que tu tentes des trucs au petit bonheur quoi. Le type d'un nombre c'est un truc qui se réfléchit. Si ton nombre doit contenir des valeurs supérieures à 65535 alors on part sur du long direct. Et si ces valeurs sont toutes positives, alors ça devient "unsigned long". Et on n'oublie pas d'adapter les formats de printf/scanf en conséquence (%lu). Et puis ton code sans déconner (sortir sur la valeur "42" !!!???!!!, utiliser "o" comme indice de boucle), on dirait que tu fais exprès de faire des trucs cons. Alors ok tu en as le droit... sauf que quand tu te plantes, on arrive mal à distinguer "ce qui a été fait de façon con" et "ce qui a été fait de façon vraiment trop con".

    Citation Envoyé par P1GOU1 Voir le message
    Était ce le seul point que tu reprochais à mon programme en ces lignes bousk ?
    A mon avis non. C'est tout le code qu'il faut repenser depuis le point de départ "nb de tirages dépassant 65535" et tout ce qui en découle. Sans oublier de factoriser (si on doit afficher 3 fois le tableau, alors on crée une fonction d'affichage. Ok c'est chiant au début car il faut se la taper mais ensuite, quand on se contente de l'appeler au lieu de tout réécrire là on apprécie). Et on essaye d'éviter les libérations anticipées.
    Bref déjà si tu fais tout ça tu auras bien avancé pour trouver l'origine du souci (qui aura probablement même alors totalement disparu)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par P1GOU1 Voir le message
    Était ce le seul point que tu reprochais à mon programme en ces lignes bousk ?
    Pas du tout tu as complètement loupé le point en fait...
    la mise en gras ne suffit pas, peut-êtr eun peu de couleur aiderait ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                free(nbgen);// Libération de mémoire
                for (k = 0 ; k < n ; k++)
                {
                    printf("Tirage : ");
                    for (x = 0 ; x < 9 ; x++)
                    {
                        nbgen[i]=rand()%36+0;    //entre 0-36
    Donc tu accèdes tranquillement à un tableau 3 lignes après l'avoir libéré et rien ne te choque ?!?!?
    Ton code marche complètement par chance quand c'est le cas.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Talend : mémoire insuffisante pour traiter 7 millions de lignes
    Par Edna24 dans le forum Exécution et industrialisation
    Réponses: 9
    Dernier message: 11/06/2009, 13h42
  2. Traiter un jeu de données
    Par moufky dans le forum MATLAB
    Réponses: 1
    Dernier message: 14/05/2008, 06h33
  3. j'arrive pas à insérit tous mes donnée dans ma base
    Par thecharmer dans le forum Général Java
    Réponses: 1
    Dernier message: 24/04/2008, 18h03
  4. je n'arrive pas a inserer de données
    Par alexlevenere dans le forum C#
    Réponses: 2
    Dernier message: 19/02/2008, 15h10
  5. Réponses: 2
    Dernier message: 12/04/2007, 08h42

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