Hallo,
ich spiel gerade ein bisschen damit Primzahlen zu berechnen. Das klappt sehr flott, allerdings bekomme ich ab einer Obergrenze von 1.000.000.000 eine OutofMemoryException...
Das Programm startet und verbraucht ca. 1GB RAM, nach ca 20 Sekunden fängt das Programm dann an sich immer mehr Arbeitsspeicher einzuverleiben bis zur Exception...(Bild2)
Wenn ich nur 100.000.000 als Obergrenze nehme, läuft das Programm fix durch und benötigt maximal 0,6GB RAM (Bild1)
Die Datenmenge bei 100Mio als Obergrenze ist (wenn man die gefundenen Primzahlen in eine txt-Datei schreibt) ca. 50 MB groß...
woran liegt das, dass so viel RAM benötigt wird und wie kann ich das verhindern bzw. kann man dem PC sagen, dass er auf den RAM nicht achten soll bzw erst ab einer Obergrenze ne Exception wirft?
Der Rechner hat 8 GB RAM zur Verfügung...
ich spiel gerade ein bisschen damit Primzahlen zu berechnen. Das klappt sehr flott, allerdings bekomme ich ab einer Obergrenze von 1.000.000.000 eine OutofMemoryException...
Das Programm startet und verbraucht ca. 1GB RAM, nach ca 20 Sekunden fängt das Programm dann an sich immer mehr Arbeitsspeicher einzuverleiben bis zur Exception...(Bild2)
Wenn ich nur 100.000.000 als Obergrenze nehme, läuft das Programm fix durch und benötigt maximal 0,6GB RAM (Bild1)
Die Datenmenge bei 100Mio als Obergrenze ist (wenn man die gefundenen Primzahlen in eine txt-Datei schreibt) ca. 50 MB groß...
woran liegt das, dass so viel RAM benötigt wird und wie kann ich das verhindern bzw. kann man dem PC sagen, dass er auf den RAM nicht achten soll bzw erst ab einer Obergrenze ne Exception wirft?
Der Rechner hat 8 GB RAM zur Verfügung...
C#-Quellcode
- static void Main(string[] args)
- {
- string ergebnis = null;
- List<string> ergebnisLst = new List<string>();
- long n = 0;
- n = 1000000000; // Obergrenze zur Berechnung von Primzahlen
- bool[] prime = new bool[n];
- for (long i = 2; i <= n - 1; i++)
- {
- prime[i] = true;
- }
- if (true)
- {
- long i = 2;
- while (i * i < n)
- {
- if (prime[i])
- {
- ergebnisLst.Add((i.ToString()));
- long j = i * i;
- while (j < n)
- {
- prime[j] = false;
- j = j + i;
- }
- }
- i += 1;
- }
- while (i < n)
- {
- if (prime[i])
- {
- ergebnisLst.Add((i.ToString()));
- }
- i += 1;
- }
- ergebnis = String.Join(" ", ergebnisLst);
- }