Anfängerfrage II: Dynamische Arrays und Speicherverbrauch
-
Hey,
wie in meinem anderen Post bereits geschildert arbeite ich mich durch die Grundlagen von C++, dabei möchte ich nachdem ich das Kapitel über dynamische Arrays durch habe nun gerne das Sieb des Eratosthenes programmieren, was als solches ja kein Problem darstellt. Das einzige was mich wundert ist, dass der belegte Arbeitsspeicher im Taskmanager für mein Programm konstant 0,5MB beträgt, auch wenn ich dynamisch Speicher anfordere (dieses Array hatte in mehreren Versuchen größen von 1.000.000.000 Bytes!). Im Taskmanager werden aber konstant 0,5MB angezeigt... Was ist der Grund dafür?
PS:
bool *table;
table = new bool [max_c];
-
bool *table; table = new bool [max_c];Ehrlich? Kennst du nicht vector?
Das einzige was mich wundert ist, dass der belegte Arbeitsspeicher im Taskmanager für mein Programm konstant 0,5MB beträgt, auch wenn ich dynamisch Speicher anfordere (dieses Array hatte in mehreren Versuchen größen von 1.000.000.000 Bytes!). Im Taskmanager werden aber konstant 0,5MB angezeigt... Was ist der Grund dafür?
Die interessantere Frage ist, warum dein Programm 1GB für den Sieb des Erasthotenes braucht.
Edit: Scherzchen mal gelöscht.
-
Arcoth schrieb:
Die interessantere Frage ist, warum dein Programm 1GB für den Sieb des Erasthotenes braucht.
Na ich sag mal die Grösse des benötigten Arrays könnte was damit zu tun haben, bis zu welcher Zahl man die Primzahlen "sieben" will.
-
Dein Betriebssystem macht eine Optimierung und gibt dir den Speicher nicht wenn du ihn mit new anforderst, sondern erst wenn du ihn benutzt. Wenn du das Array voll schreibst wird dir der Taskmanager auch eine entsprechende Speicherbelegung anzeigen.
Es gab mal einen coolen Artikel wo vorgeschlagen wurde, dass man bei 64-Bit-Systemen bei Arrays prinzipiell immer 64GB anfordert, egal wieviel man braucht. Die Optimierungen sorgen dann dafür, dass nur der benötigte Speicher auch tatsächlich benutzt wird.
-
Frolo schrieb:
Das einzige was mich wundert ist, dass der belegte Arbeitsspeicher im Taskmanager für mein Programm konstant 0,5MB beträgt, auch wenn ich dynamisch Speicher anfordere (dieses Array hatte in mehreren Versuchen größen von 1.000.000.000 Bytes!). Im Taskmanager werden aber konstant 0,5MB angezeigt... Was ist der Grund dafür?
Hast du den reservierten Speicher auch wirklich beschrieben? Der Speicher wird von der dynamischen Speicherverwaltung oft erst gemappt, wenn er auch tatsächlich genutzt wird.
-
Jau. Zb. unter Linux werden große Allokationen prinzipiell nicht über den Heap sondern über mmap bedient. Schon vom Design her werden Speicherseiten erst beim ersten Lese-/Schreibezugriff auf den RAM/Swap gemappt.
Will man ordentlich RAM verbrauchen dann allokiert man Größen knapp unter dem Maximum das vom Heap verwaltet wird.
-
hustbaer schrieb:
Arcoth schrieb:
Die interessantere Frage ist, warum dein Programm 1GB für den Sieb des Erasthotenes braucht.
Na ich sag mal die Grösse des benötigten Arrays könnte was damit zu tun haben, bis zu welcher Zahl man die Primzahlen "sieben" will.
Klar, ich dachte nun, er beschränkt das auf kleine Beispiele. Welche obere Suchgrenze ist schon so groß, dass das Array in diese Größenordnungen schießt?
-
Sieben an sich braucht wenig Speicher (segmented sieve). Will man die Primzahlen aber ueber den Siebprozess hinaus im Programm benutzen, so muessen sie in einem Array abgelegt werden. Bei der trivialen Methode bis 10^9 wirst du sehr lange auf das Ergebnis warten muessen. Fang doch etwas kleiner an, 10000 sollten reichen.
Nebenbei: Nutzt man "prime wheels" kann der Speicherbedarf deutlich gesenkt werden. Beispielsweise sollten ca. 28 MByte fuer alle Primezahlen bis 10^9 ausreichen wenn Bits statt Bytes benutzt werden. Jedoch sind das fortgeschrittene Techniken und wenig anfaengerfreundlich.
Welche obere Suchgrenze ist schon so groß, dass das Array in diese Größenordnungen schießt?
10^11 mit Wheel (kommt aber auch af das benutzte Rad an).