Speicherallozierung



  • Hallo!

    ich stehe vor folgendem Problem:

    Unsere Modelldaten werden in sog. Module einsortiert.
    Jedes Modul besteht dann aus mehreren Elementen, die jeweils wieder auf Koordinaten referenzieren

    Ich habe mir dazu folgendes für die interne Datenablage überlegt:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    
    #define CALLOC(Ptr,Type,Size)\
    Ptr = (Type*) calloc( Size , sizeof(Type) ); \
    if (!Ptr) printf("ERROR: calloc error in line %i!\n",__LINE__);
    
    #define MAXELEM   99999
    #define MAXMODULE 999
    
    typedef struct {
      unsigned int GID;
      double         X;
      double         Y;
      double         Z;
    }Type_Grid;
    
    typedef struct { 
      unsigned int ID;
      unsigned int PID;
      unsigned int Type;
      Type_Grid GID1; 
      Type_Grid GID2; 
      Type_Grid GID3; 
      Type_Grid GID4; 
    }Type_Element;
    
    typedef struct {
      unsigned int ID;
      Type_Element Element[MAXELEM];
    }Type_Module;
    
    Type_Module* Module;
    
    int main(){
    
    CALLOC(Module,Type_Module,MAXMODULE);
    
    Module[0].Element[0].ID=100;
    
    return (0);
    
    }//int main()
    

    Das klappt soweit auch, allerdings können pro Modul mehr als die definierten MAXELEM Elemente auftauchen.
    Wenn ich MAXELEM erhöhe, bekomme ich einen Fehler aus calloc, daß kein Speicher alloziert werden kann.

    Komme ich da irgendwie ans Maschinenlimit, weil ich bei der Speicherallozierung was falsch mache? Meine Kiste hat 132113 MB und andere speicherintensive Anwendungen laufen nicht drauf, sollte daher reichen...

    Oder habe ich die ganze Sache "unschlau" angefangen?

    Ciao

    OkkaPapa



  • sizeof(Type_Grid) = 32
    sizeof(Type_Element) = 144
    sizeof(Type_Module) = 14399864
    

    Damit wärst du beim CALLOC bei 14385464136 Bytes (ca. 13 GB).
    Laut Valgrind:

    total heap usage: 1 allocs, 0 frees, 14,385,464,136 bytes allocated
    

    Bei Erhöhen von MAXELEM entsprechend mehr.

    Eine "schlauere" Lösung wäre, Type_Module.Element auch als Pointer zu modellieren und immer nur so viel Speicher anfordern wie tatsächlich benötigt.

    Das Betriebssystem kann die Ressourcen auch pro Prozess begrenzen. Welches benutzt du denn?



  • Hallo!

    Ich arbeite unter Red Hat Enterprise Linux Workstation release 6.5 (Santiago)

    Dann kann ich den ersten Ansatz wohl vergessen...

    Wenn ich das alles dynamisch alloziere, dann laufe ich vermutlich irgendwann in ein Laufzeitproblem...



  • Mit ulimit -d bekommst du das Limit angezeigt.

    13 GB an Daten sind schon ne Menge. Das dauert auch ne Weile, bis das alloziert ist. Musst du immer alles im Speicher haben?

    Warum glaubst du irgendwann in Laufzeitprobleme zu laufen?


Anmelden zum Antworten