Hello,

J'aurais besoin de mettre en mémoire un fichier de log pour le parser.
En l’occurrence, il pèse 226MB et quand je tente de mettre le contenu de mon fichier dans un string, l'allocation échoue.

Pour comprendre un peu plus et trouver la valeur max, j'ai crée une boucle qui me fait des malloc successifs en incrémentant de 1 MB par 1MB, de 0 jusqu'à 100MB pour voir jusqu'où je peux aller et il semblerait que le max que je puisse allouer est 62MB.

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
 
        char *p = NULL;
        int i = 0;
        int total_i = 0;
        for ( i = 0 ; i<100 ; i++ )
        {
            if ( allocate_1D_c( i*1024*1024 ) )
            {
                total_i+=i;
                printf("\n%d MB\nTotal MB %d", i, total_i);
                free(p),p=NULL;
            }
            else
            {
                printf("\nFAILED %d MB",i);
            }
        }
        system("pause");
Dans mon fichier de log, le résultat est le suivant :
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
 
allocate.h::allocate_1D_c -> Not enough space, 63.000000
allocate.h::allocate_1D_c -> Not enough space, 64.000000
allocate.h::allocate_1D_c -> Not enough space, 65.000000
allocate.h::allocate_1D_c -> Not enough space, 66.000000
allocate.h::allocate_1D_c -> Not enough space, 67.000000
allocate.h::allocate_1D_c -> Not enough space, 68.000000
allocate.h::allocate_1D_c -> Not enough space, 69.000000
allocate.h::allocate_1D_c -> Not enough space, 70.000000
allocate.h::allocate_1D_c -> Not enough space, 71.000000
allocate.h::allocate_1D_c -> Not enough space, 72.000000
allocate.h::allocate_1D_c -> Not enough space, 73.000000
allocate.h::allocate_1D_c -> Not enough space, 74.000000
allocate.h::allocate_1D_c -> Not enough space, 75.000000
allocate.h::allocate_1D_c -> Not enough space, 76.000000
allocate.h::allocate_1D_c -> Not enough space, 77.000000
allocate.h::allocate_1D_c -> Not enough space, 78.000000
allocate.h::allocate_1D_c -> Not enough space, 79.000000
allocate.h::allocate_1D_c -> Not enough space, 80.000000
allocate.h::allocate_1D_c -> Not enough space, 81.000000
allocate.h::allocate_1D_c -> Not enough space, 82.000000
allocate.h::allocate_1D_c -> Not enough space, 83.000000
allocate.h::allocate_1D_c -> Not enough space, 84.000000
allocate.h::allocate_1D_c -> Not enough space, 85.000000
allocate.h::allocate_1D_c -> Not enough space, 86.000000
allocate.h::allocate_1D_c -> Not enough space, 87.000000
allocate.h::allocate_1D_c -> Not enough space, 88.000000
allocate.h::allocate_1D_c -> Not enough space, 89.000000
allocate.h::allocate_1D_c -> Not enough space, 90.000000
allocate.h::allocate_1D_c -> Not enough space, 91.000000
allocate.h::allocate_1D_c -> Not enough space, 92.000000
allocate.h::allocate_1D_c -> Not enough space, 93.000000
allocate.h::allocate_1D_c -> Not enough space, 94.000000
allocate.h::allocate_1D_c -> Not enough space, 95.000000
allocate.h::allocate_1D_c -> Not enough space, 96.000000
allocate.h::allocate_1D_c -> Not enough space, 97.000000
allocate.h::allocate_1D_c -> Not enough space, 98.000000
allocate.h::allocate_1D_c -> Not enough space, 99.000000
Sachant que je dispose de 16Go de RAM dont 6Go en cours d'utilisation à l'instant soit à priori 10Go de libre. (Win10)
En regardant le gestionnaire des tâches, je constate que la mémoire allouée se cumule au file de la boucle. C'est pour ça que j'ai ajouté dans la boucle une variable pour compter le cumul de la mémoire allouée ( réussi 62 ), ce qui donne 1953MB. Et le processus correspondant à l’exécution du programme fait 1958MB à la fin. Cela correspond moins la mémoire système pour l'invite de commande qui doit prendre 5MB je suppose.
Je ne comprends pas pourquoi la mémoire n'est pas libérée en instantanée comme demandée dans la boucle mais seulement à la fin.

La question finale est comment puis-je contourner le fait que je ne puisse allouer que 62MB max via un malloc ? ( si c'est faisable ) .

Merci d'avance pour vos luminaires.

Cordialement.