Autor Beitrag
Nikola
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win 3.11, Win 98, Win 2000, Win XP
D 1.0 C/S, D6 Prof. 2005 Prof.
BeitragVerfasst: Mo 04.08.03 06:50 
Wehrend Übertragung von Paradox ins mySQL 21352 Datensätze,
bricht das Programm bei 19744 Datensatz mit folgendem Fehler.
Schreiben tu ich mit TTable.

Zitat:
Im Projekt Konvert.exe ist eine Exception der Klasse EStreamError aufgetreten. Meldung:?Expandieren der Speicher-Stream wegen Speichermangel nicht möglich?. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.


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:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
procedure TForm1.BitBtn2Click(Sender: TObject);
var
  i          : Integer;
  Z          : Longint;
  mLaenge    : Integer;
  mStr       : String;
  mMerkDatum : array[1..250] of String[4];
  mFielNameP : array[1..250] of String[25];
  mFielName  : array[1..250] of String[25];
begin
  Z:=0;
  for i:=1 to 250 do
  begin
    mFielNameP[i]:='';
    mFielName[i]:='';
    mMerkDatum[i]:='';
  end;
  for i:=1 to FldList.Items.Count-1 do
  begin   // main output loop //
    mStr:=Copy(FldList.Items[i],1,25);
    mMerkDatum[i]:=Copy(FldList.Items[i],26,4);
    mLaenge:=Pos(' ', mStr);
    Delete(mStr,mLaenge,25);
    if not ('PRIMARY'=Copy(mStr,1,7)) then
    begin
      mFielNameP[i]:=mStr;
      while Pos('-', mStr) > 0 do
      begin
        mStr[Pos('-', mStr)]:='_';
      end;
      mFielName[i]:=mStr;
    end else
    begin
      Break;
    end;
  end;   // Main output loop //
  WorkTable.Active:=TRUE;
  myTabelle.Open;
  WorkTable.First;
  Gauge.MaxValue:=WorkTable.RecordCount;
  Gauge.Progress:=0;
  repeat
    Gauge.Progress:=Gauge.Progress+1;
    try
      myTabelle.Insert;
      for i:=1 to FldList.Items.Count-1 do
      begin
        if mFielName[i]>'' then
        begin
          if mMerkDatum[i]='DATE' then
          begin
            myTabelle.FieldbyName(mFielName[i]).Value:=amiDatum(WorkTable.FieldbyName(mFielNameP[i]).Value);
          end else
          begin
            myTabelle.FieldbyName(mFielName[i]).Value:=WorkTable.FieldbyName(mFielNameP[i]).Value;
          end;
        end;
      end;
      inc(Z);
      Zaehler.Caption:=IntToStr(Z);
    finally
      myTabelle.Post;
    end;
    myTabelle.Cancel;
    WorkTable.Next;
  until WorkTable.Eof;
  myTabelle.Close;
  WorkTable.Active:=FALSE;
  Gauge.Progress:=0;
end;


Bitte um Hilfe.

Moderiert von user profile iconUGrohne: Code- durch Delphi-Tags ersetzt
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mo 04.08.03 17:58 
Hast Du schonmal probiert, genau zu lokalisieren, an welcher Stelle der Error passiert? Nimm mal nen Haltepunkt an den Anfang der Schleife und setz den Durchlaufzähler auf die 19743. Dann gehst Du Schritt für Schritt alles durch und kriegst die Stelle, wo der schöne Fehler passiert. Vll. kann man dann mehr helfen :wink:
Nikola Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win 3.11, Win 98, Win 2000, Win XP
D 1.0 C/S, D6 Prof. 2005 Prof.
BeitragVerfasst: Di 05.08.03 08:51 
Hallo,

es ist ein Arbeitsspeicher Problem,
wehrend der Übertragung weckst der Speicher und dann bricht das Programm ab.
Die frage ist warum weckst er.

Arbeitsspeicher im Rechner 512 MB

mfg.
Nikola
Neuromancer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinNT 4.0 SP6a, WIN 2k Prof SP3, Win XP Prof SP1
D5 Ent, D6 Ent
BeitragVerfasst: Di 05.08.03 09:01 
Normalerweise kann das nicht das Problem sein, denn selbst wenn dir der RAM ausgeht, ist Windows schlau genug und lagert dann auf die Festplatte aus. D.h. die Operation sollte dann langsamer werden, aber nicht einfach aufhören.

Habe den Code nicht genau unter die Lupe genommen, aber was mir auffällt ist, dass du den Post in einem finally-Block untergebracht hast. Das ist ein wenig unglücklich programmiert, denn auf Biegen und Brechen den Post zu erzwingen kann keine Lösung sein.
Wenn der Post jetzt fehlschlägt, dann springt das Programm an dieser Stelle raus. Du solltest ihn besser in einen try-except packen und dann auf den Fehler überprüfen und dir die Fehlermeldung ausgeben lassen.

Gruß
Neuromancer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinNT 4.0 SP6a, WIN 2k Prof SP3, Win XP Prof SP1
D5 Ent, D6 Ent
BeitragVerfasst: Di 05.08.03 09:11 
Vielleicht verdeutlich das der folgende Code ein wenig:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TfrmMain.Button1Click(Sender: TObject);
var
  a, b : integer;
begin
  try
    a := 1;
    b := 0;
  finally
    b := a div b;
  end;
  ShowMessage('Hier sollte es eigentlich weiter gehen...');
end;


In diesem Beispiel wird der ShowMessage niemals aufgerufen.

Gruß
Nikola Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win 3.11, Win 98, Win 2000, Win XP
D 1.0 C/S, D6 Prof. 2005 Prof.
BeitragVerfasst: Di 05.08.03 09:23 
OK.
versuche in try except

Nikola
Nikola Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win 3.11, Win 98, Win 2000, Win XP
D 1.0 C/S, D6 Prof. 2005 Prof.
BeitragVerfasst: Di 05.08.03 10:26 
hab das ganze in try except gemacht und auch ohne
und der bricht weiter ab!

Habe dann Arbeitspeicher zur anzeige gemacht

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    with mRAM do
    begin
      dwLength := SizeOf(mRAM);
      GlobalMemoryStatus(mRAM);
      ProgressBar.Max := dwTotalPhys;
      ProgressBar.Position := dwAvailPhys;
      ProgressBar.Position := dwTotalPhys - dwAvailPhys;
    end;



und die tadsache ist das es permanent fühlt, wenn ehr voll ist und noch ca. 100 Datensätze geschrieben sind brich das Programm ab, es dauert ca. 10 sec. bis sich Delphi wider aufgebaut nach dem Abbruch.

es ist der RAM, wie kann man dem zwischen durch freigeben?
Nikola Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win 3.11, Win 98, Win 2000, Win XP
D 1.0 C/S, D6 Prof. 2005 Prof.
BeitragVerfasst: Mi 06.08.03 07:26 
habe den fahler gefunden und der lag in Komponente,
für myTabelle habe ich die von mySQLDAC und bei Limit wahr 1 eingetragen so das es immer ein RAM verbrauch war habe dann auf 0 gesetzt und es ging ohne Probleme. :P

Nikola