Malloc Les Problèmes De Mémoire

tout d'abord, j'ai remarqué que lorsque je compare la mémoire de malloc à celle de calloc, l'empreinte mémoire est différente. Je travaille avec des ensembles de données de plusieurs GB. Il est normal que ces données soient aléatoires.

Je m'attendais à ce que je puisse malloc une grande quantité de mémoire et de lire toutes les données aléatoires qui étaient dans elle moulée à un flotteur. Cependant, si l'on regarde l'empreinte mémoire dans le visualiseur de processus, la mémoire n'est évidemment pas revendiquée (par opposition à calloc où je vois une grande empreinte). J'ai couru une boucle pour écrire des données dans la mémoire, puis j'ai vu l'empreinte mémoire de la montée. ai-je raison de dire que la mémoire n'est pas revendiquée jusqu'à ce que je l'initialiser?

enfin après que je suis passé 1024*1024*128 bytes (1024 Mo dans la fenêtre process viewer) j'ai commencé à avoir des segfaults. Calloc semble toutefois initialiser le plein montant jusqu'à 1 Go. pourquoi j'obtiens des segfaults lors de l'initialisation de la mémoire dans une boucle for avec malloc à ce numéro 128MB et pourquoi l'empreinte mémoire montre 1024MB?

si malloc une grande quantité de mémoire et ensuite lire à partir de celle-ci ce que je reçois (depuis le visionneur de processus montre presque aucune empreinte jusqu'à ce que je l'initialise)?

enfin, y a-t-il un moyen pour moi d'allouer plus de 4 Go? je teste la performance de la hiérarchie de la mémoire.

Code pour #2:

    long long int i;
    long long int *test=(long long int*)malloc(1024*1024*1024);
    for (i=0;i<1024*1024*128;i++)
            test[i]=i;

    sleep(15);
3
demandé sur Joshua Enfield 2010-12-08 03:18:34

4 réponses

1 - Si vous travaillez sur une machine 32 bits, vous ne pouvez pas avoir une variable avec plus de 2GBs alloué.

2 - Si vous travaillez sur une machine 64 bits, vous pouvez allouer autant que la mémoire RAM+Swap au total, cependant, allouer tout pour une variable nécessite un gros morceau de mémoire conséquent qui pourrait ne pas être disponible. Essayez-le avec une liste liée, où chaque élément a seulement 1 Mo assigné et vous pouvez atteindre une mémoire plus élevée allouée au total.

3-comme Sharth et vous l'avez noté, si vous n'utilisez pas votre mémoire, linux ne l'attribuera pas.

3
répondu Pirooz 2010-12-08 01:43:37

quelques notes:

  1. comme le notent les commentaires, Linux n'affecte pas votre mémoire avant de l'avoir utilisée.
  2. quand vous utilisez calloc au lieu de malloc, il supprime toute la mémoire que vous avez demandée. C'est l'équivalent de l'aide.
7
répondu Bill Lynch 2010-12-08 00:54:01

votre #2 est en panne avec un segfault soit parce que sizeof(long long int) > 8 ou parce que votre malloc est retourné NULL. C'est très possible si vous demandez 1 Go de RAM.

Plus d'infos sur le #2. De votre commentaire de 128 Mo j'obtiens l'idée que vous ne pouvez pas réaliser ce qui se passe. Parce que vous déclarez le pointeur du tableau comme long long int la taille de chaque élément du tableau est de 8 octets. 1024/8 == 128 c'est pourquoi votre boucle fonctionne. C'est arrivé quand je l'ai essayé, de toute façon.

1
répondu Zan Lynx 2010-12-08 01:29:18

votre boucle for dans votre exemple de code Touche en fait 1 Go de mémoire, puisqu'il est indexé 128*1024*1024 long long s, et chaque long long est de 8 octets.

1
répondu caf 2010-12-08 01:51:08