Mehr Speicher als ca.430MByte für einen Prozess
-
Hallo zusammen,
ich ermittle Primzahlen mit Hilfe eines Arrays aus Strukturen von einer int Primzahl und einer int Summe dieser Primzahl
#define start 57000000 // start with the stored prims up to this number #define Number 1000000 // add number of prims typedef struct stPrimsum { int prim; int sum; /* } primsums[start+Number-1]; */ } primPlusSum;
Den Speicher fuer das Array allociere ich so
int main(void) { primPlusSum *primsums; primsums = malloc ( 58000000 * sizeof(primPlusSum) ); // Speicherreservierung ...
und fuelle das Array dann aus einer Datei
Datei = fopen (test, "r"); i = 0; while ( (fscanf (Datei,"%d,", &primsums[i].prim) ) != EOF ) { primsums[i].sum = primsums[i].prim; i++; } // Datei schliessen fclose (Datei);
Nun ist mir aber aufgefallen, dass die Speicherauslastung meines Programms laut Taskmanager beim Laden des Array anwaechst, aber nicht mehr als ca.430MByte nutzt, obwohl die Maschine 4GB besitzt.
Kompiliert habe ich mit Dev C++ V.4.9.9.2 ohne Änderungen an den Compiler-Options.
Wie kann mein Programm mehr Speicher (z.B. 1GB oder sogar 2GB) nutzen ?
-
Na, warum wird dein Programm wohl nicht mehr Speicher verbrauchen?
58 000 000 * 8 Byte = 442.504883 megabytes
Fällt dir was auf?
-
DAS war wirklich zu offentsichtlich !!
Aber was mich stutzig macht ist der Umstand, dass ich Stueck fuer Stueck jeweils weitere 1000000 "dazuberechnet" habe.
Dies ging soweit ganz gut bis 53000000.
Aber dann stiegt die Laufzeit fuer die weiteren 1000000 schlagartig anSiehe:
Anzahl 48.000.000 bis 48.999.999: 199261sec = 55,35h; letzte Primz: 961.748.927 delta = 20.664.946 deltaDelta = 778
Anzahl 49.000.000 bis 49.999.999: 202879sec = 56,36h; letzte Primz: 982.451.653 delta = 20.702.726 deltaDelta = 37780
Anzahl 50.000.000 bis 50.999.999: 209161sec = 58,10h; letzte Primz: 1.003.162.753 delta = 20.711.100 deltaDelta = 8374
Anzahl 51.000.000 bis 51.999.999: 210759sec = 58,54h; letzte Primz: 1.023.893.771 delta = 20.731.018 deltaDelta = 19918
Anzahl 52.000.000 bis 52.999.999: 215695sec = 59,92h; letzte Primz: 1.044.645.379 delta = 20.751.608 deltaDelta = 20590
Anzahl 53.000.000 bis 53.999.999: 218941sec = 60,82h; letzte Primz: 1.065.433.423 delta = 20.788.044 deltaDelta = 36436
Anzahl 54.000.000 bis 54.999.999: 355509sec = 98,75h; letzte Primz: 1.098.598.643 delta = 33.165.220 deltaDelta = 12377176
Anzahl 55.000.000 bis 55.999.999: 456593sec = 126,83h; letzte Primz: 1.140.925.187 delta = 42.326.544 deltaDelta = 9161324
Anzahl 56.000.000 bis 56.999.999: 461666sec = 128,24h; letzte Primz: 1.183.627.871 delta = 42.702.684 deltaDelta = 376140Hast Du dafuer vielleicht auch eine Erklaerung ?
-
stoffel31 schrieb:
Hast Du dafuer vielleicht auch eine Erklaerung ?
Nein, zu wenig Information für eine Diagnose. Ich weiß ehrlich gesagt noch nicht mal, was dein Programm überhaupt macht und was die Zahlen bedeuten.
Schick dein Programm durch einen Profiler, am besten einen mit einer richtig detaillierten Analyse die auch Speicherfehler und Cache-Misses beinhaltet, und vergleich mal was sich ändert.
-
Was ist ein Profiler ?
Und wo bekomme ich sowas her ?
Am besten auch kostenlos !
Danke !
-
stoffel31 schrieb:
Was ist ein Profiler ?
Kennst du Wikipedia?
Tolle Sache.
Auch wenn die Sachen nicht ganz so tiefgreifend erklärt sind, bekommt man eine Übersicht.Achso, du musst den
Profiler (Programmierung)
auswählen.
-
Zunächst mal: Zwischen 1.140.925.187 und 1.183.627.871 gibt es gut zwei Millionen Primzahlen, nicht eine. Zweitens: 128 Stunden?! Zum Vergleich:
time primes 1140925187 1183627871 | wc -l 2045547 real 0m0.438s user 0m0.444s sys 0m0.024s
Ansonsten ist davon auszugehen, dass deine Primzahlsumme sehr schnell überlaufen wird. Wenn int bei dir 32 Bit hat, wovon angesichts des Speicherverbrauchs auszugehen ist, passen da nur Werte bis 2.147.483.647 hinein; von den Primzahlen zwischen 1.140.925.187 und 1.183.627.871 kannst du so keine zwei addieren.
Irgendwas läuft da gehörig schief bei dir. Wie berechnest du denn, ob eine Zahl prim ist oder nicht?