Autor Beitrag
kat1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 40

Win XP
D6 EntPr
BeitragVerfasst: Mi 18.06.03 14:45 
Hallo,

langsam bringt mich mein Prog zur Verzweiflung. Ich muss eine Matrix variabler Größe aufbauen (also ein 2-dimensionales array). Jedes Element dieser Matrix ist eine komplexe Zahl, d.h. sie belegt einen Speicherplatz von 2x extended. Wird diese Matrix jetzt allerdings größer als 1000x1000, so überschreite ich den verfügbaren Systemspeicher von immerhin noch 512 MB. Zumindest muss ich das glauben, denn Win98 zeigt mir einen Bluescreen mit dem Titel Fataler Fehler Programm wird beendet. Ich dachte bisher immer, wenn der Hauptspeicher überläuft, dann wird automatisch ausgelagert oder bin ich hier im falschen Film und das klappt nicht mit der Delphi-Speicherverwaltung? Die Größe der Matrix soll noch bis auf vielleicht 5000x5000 anwachsen.

Vielleicht hat jemand einen Rat für eine effizientere Speicherverwaltung, dass mein Prog überhaupt läuft? :cry:

Danke im voraus.

Uwe
Phantom1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 390



BeitragVerfasst: Mi 18.06.03 15:25 
mhhh... : 5000x5000x10Byte = belegt 238 Megabyte Speicher, unter winXP gehts jedenfalls, muss also wirklich an Win98 liegen.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 18.06.03 15:41 
Wie wäre es denn, selber auszulagern? Erzeuge einfach Funktionen, die dir den Wert dann aus einer von 5000 Dateien mit jeweils 5000 Werten auslesen bzw. diesen wieder zuückschreiben.
Vielleicht sogar noch schöner wäre das Benutzen eines RDBMS (ich empfehle Firebird), macht aber natürlich ein wenig Arbeit.

Ja, beides ist nicht so schnell wie die RAM-Operation, aber wenn´s nicht klappt und trotzdem unbedingt klappen muss...

Cu,
Udontknow
kat1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 40

Win XP
D6 EntPr
BeitragVerfasst: Mi 18.06.03 17:06 
Erstmal danke für die Antworten, es ist richtig, dass es kein Problem mit dem Speicher geben dürfte, auch wenn die Rechnung nicht richtig ist, denn es sind 5000x5000x20 Byte.
@Udontknow, wenn ich selber auslagere, bringe ich mich doch aber auch um den Genuss des schnellen Arbeitens mit dem Hauptspeicher. Und ich brauche die Elemente dieser Matrix auch noch mehrfach, um damit ein Gleichungsystem mit eben dieser Anzahl Unbekannten lösen zu können.

Habe aber inzwischen mein Prog über Netzwerk auf einen XP-Rechner geschoben und dort probiert, dort läuft es einwandfrei, bis ich zu einer Fehlerabfrage komme und eine Invalid Floating Point Operation erzeuge. Das liegt an den von mir verwendeten Dateien, von denen leider zwei falsch berechnet wurden und die ich jetzt neu berechnen muss. Allerdings schafft es Windows XP mir diese Fehlermeldung zu zeigen, während Win98 einfach gnadenlos abschmiert, da hätte ich noch ewig nach dem Fehler suchen können. Vielen Dank an MS. :evil:

Jedenfalls habe ich inzwischen 1 GB Hauptspeicher und das sollte jetzt laufen.

Nochmals vielen Dank

Werde nachdem ich die Datei neu berechnet habe, nochmal reinsetzen, ob es wirklich daran gelegen hat. Wenn jemand trotzdem eine Idee hat, warum Windows das macht, bitte posten. Danke

Uwe
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 18.06.03 17:41 
Hallo,

du sagst die Matrix muss noch auf 5000x5000 anwachsen. Kann ich dadraus schließen, dass du ein Dynamisches Array hast, desen Speichgrenzen du mehrmals zur Laufzeit änderst?
Wenn das so ist, findest du eine erklährung für dein Problem hier.

Gruß
Klabautermann
kat1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 40

Win XP
D6 EntPr
BeitragVerfasst: Mi 18.06.03 18:14 
Nein, mein Problem hängt von Variablen ab, die ich zu Anfang meines Programms eingebe. Daraus kann ich die Anzahl der Unbekannten in meinem Gleichungsystem berechnen und lege dann auch nur die Größe des Arrays einmal fest. Für eine weitere Berechnung wird der Array zuvor auf eine Länge von [0,0] gesetzt.

Hier mal ein wenig Code:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
function Unknowns:integer;
//This function calculates the number of unknowns in the linear equation system
//for the interactive scattering coefficients a(mn) and b(mn) of each sphere
var
  sum,i:integer;
begin
  sum:=0;
  for i:=1 to Nl do
    sum:=sum+2*WiscombeNumber[i-1]*(WiscombeNumber[i-1]+2);
  Result:=sum;
end;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//

procedure Matrix_Construction;
//This procedure builds the matrix of vector translation coefficients for the
//solution process for the linear equation system Ax=b for interactive scattering coefficients
var
  Le,h,i,j,l,n,m,nu,mu:integer;
  beta:extended;
  GauntCoeff:array[1..20of TGaunt;
  PosMatrix:array[1..20of TPosition;
begin
  for i:=1 to 20 do
    begin
      AssignFile(GauntCoeff[i],'GauntCoeff_20_'+IntToStr(i)+'.dat');
      //Reading the files with the Gaunt Coefficients
      AssignFile(PosMatrix[i],'PosMatrix_20_'+IntToStr(i)+'.dat');
      //Reading the files with the position numbers of the Gaunt Coeff's in their
      //files because the previous algorithm is not recursive to directly obtain
      //the position of the pointer
      ReSet(GauntCoeff[i]); //open the files
      ReSet(PosMatrix[i]);
    end;
  beta:=PiOn2; //Polarization angle Pi/2
  Le:=Unknowns; //Length of the vector is equal to number of unknowns
  SetLength(Vector_pq,Le);
  SetLength(Matrix_AB,Le,Le);
  //Now the Matrix and the resulting vector can be built


Uwe