Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehlermeldung "Zu wenig Arbeitsspeicher" (https://www.delphipraxis.net/118362-fehlermeldung-zu-wenig-arbeitsspeicher.html)

p80286 6. Aug 2008 15:31

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Hallo Micha,
ich vermute das ist nicht so gewollt:
Zitat:

begin
beg:=pos('/*',Temp);
en:=pos('*/',Temp);
if en=0 then en:=Length(Temp);
Dies würde bedeuten, wenn '*/' ,aus welchen Gründen auch immer, fehlt dann wird gnadenlos bis zum Ende gelöscht!

und ob es hiermit keinen Ärger gibt weiß ich auch nicht:
Zitat:

enStr:= copy(Temp,en+2,Length(Temp));
Ich weiß nicht ob in Deinen Daten solche Konstrukte möglich sind:
Delphi-Quellcode:
Select Daten
/* ab hier jetzt auswählen
-- ,daten1
-- ,daten2
-- ,daten3
-- Bitte das Datumsformat beachten !! */
from .......
es gibt Clients, die so etwas verdauen können. In diesem Fall handelst Du Dir durch das löschen der Zeilenkommentare '--' eine Menge Ärger ein, weil dann nur noch "Select Daten" übrig bleibt.

Gruß
K-H

spaxxn 6. Aug 2008 15:44

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
:stupid:

DerAndereMicha 6. Aug 2008 15:46

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Hallo p80286,

1. Ich denke durch die Bedingung

Delphi-Quellcode:
(pos('*/',Temp)>pos('/*',Temp))
in der WHILE-Schleife, sollte die IF-Anweisung

Delphi-Quellcode:
if en=0 then en:=Length(Temp);
gar nicht auslösen - ist quasi eine Altlast.

2. Warum sollte die Zeile

Delphi-Quellcode:
enStr:= copy(Temp,en+2,Length(Temp));
Ärger bringen?

3. Da geb ich Dir recht und werd mir was überlegen.


Gruß
Micha

DerAndereMicha 6. Aug 2008 15:46

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Hallo spaxxn,

na und?

Gruß
Micha

p80286 6. Aug 2008 15:58

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Hallo Micha,

da en+2 größer als length(temp) ist.

In der Vergangenheit bin ich damit mal vor die Wand gelaufen darum benutze ich immer

Delphi-Quellcode:
if startpos<=length(daten) then
   dummy:=copy(daten,startpos,lange);
um ganz sicher zu gehen

Delphi-Quellcode:
if (startpos>length(daten)) and (lange>0) then
   dummy:=copy(daten,startpos,lange);
oder
Delphi-Quellcode:
if startpos+lange-1<=length(daten) then
   dummy:=copy(daten,startpos,lange);
Gruß
K-H

nahpets 6. Aug 2008 16:13

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Hallo,
Zitat:

es gibt Clients, die so etwas verdauen können. In diesem Fall handelst Du Dir durch das löschen der Zeilenkommentare '--' eine Menge Ärger ein, weil dann nur noch "Select Daten" übrig bleibt.
Reihenfolge ändern, erst /* bis */ und dann im Rest noch --

Vorschlag für die Kommentare mit /* */

von hinten nach vorne durch die Liste laufen und wenn ein */ gefunden wurde in der Zeile alles bis einschließlich */ löschen,
dann bis nach vorne weiter alle Zeilen löschen, in denen kein /* vorkommt bis zu der Zeile in der /* vorkommt und in der Zeile alles ab dem /* löschen.

Auch sowas ist möglich:

SQL-Code:
Select
Daten /* ab hier jetzt auswählen
-- ,daten1 
-- ,daten2 
-- ,daten3 
-- Bitte das Datumsformat beachten !! */ from .......
Stelle mir das in etwa so vor (nicht getestet!!!)
Delphi-Quellcode:
bKom := false;
for i := SQLLines.Count-1 downto 0 do begin
  iPosEnde := Pos('*/',SQLLines[i]);
  if iPosEnde > 0 then begin
    s := Copy(SQLLines[i],1,iPosEnde - 1);
    SQLLines[i] := s;
    bKom := True;
  end else begin
    iPosAnfang := Pos('/*',SQLLines[i]);
    if iPosAnfang > 0 then begin
      s := Copy(SQLLines[i],iPosAnfang - 1, length(SQLLines[i]) - iPosAnfang);
      SQLLines[i] := s;
      bKom := False;
    end;
  end;
  if bKom then SQLLines.Delete(i);
end;
for i := SQLLines.Count-1 downto 0 do begin
  bKom := Copy(Trim(SQLLines[i]),1,2) = '--';
  If bKom Then SQLLines.Delete(i)
end;
Du sparst dadurch viele pos auf die ganze Stringliste. Pos ist immer nur für eine Zeile erforderlich, Du brauchst halt zusätzlich einen Schalter zum merken, ob Du in einem Kommentar bist oder nicht.

Stephan

PS.: Dein Speicherproblem muss aber nicht hier liegen, mag sein, das viel Speicher gebraucht wird. Versuche trotzdem heraus´zufinden, was auf dem Rechner zum Zeitpunkt des Fehlers sonst noch so alles unterwegs ist, eventuell läuft ja zuweilen parallel noch ein anderer "Speicherfresser". Im Zweifelsfalle versuche in einem Try-Except-Block herauszubekommen, wie groß die Stringliste ist, wieviel Speicher Dein Programm braucht und wieviel Speicher andere Programme brauchen.

p80286 6. Aug 2008 17:06

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Hallo zusammen,

ich habe einmal zusammengekramt wie groß unsere SQL-Scripte so sind.
Die meisten liegen bei ca. 1-5K
wenige haben bis zu 50..60K
und ganz wenige mehr als 300K.
Die enthalten dann aber auch gleich ein paar Daten .

Die 300K sollten eigentlich überhaupt kein Problem sein. Wenn ich mich richtig erinnere werden daraus ca. 600K wenn die Datei geladen ist. Da bleibt eigentlich noch genügend Platz für andere Daten und Programme.
(wenn im fraglichen Script allerdings eine vollständige DB-Generierung + Daten steckt, dann allerdings)

Gruß
K-H

DeddyH 6. Aug 2008 17:21

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Ich hab da auch mal einen Versuch gestartet (könnte aber bei sehr großen Skripten auch ein Speicher- oder Performanceproblem haben):
Delphi-Quellcode:
procedure StripSQLComments(const sl: TStrings);
const cmBegin = '/*';
      cmEnd = '*/';
      cmOneLine = '--';
var i,start,ende: integer;
    temp: string;
begin
  sl.BeginUpdate;
  try
    //Mehrzeilige Kommentare entfernen
    temp := sl.Text;
    start := Pos(cmBegin,temp);
    ende := Pos(cmEnd,temp);
    while (start > 0) and (ende > start) do
      begin
        System.Delete(temp,start,ende - start + Length(cmEnd));
        start := Pos(cmBegin,temp);
        ende := Pos(cmEnd,temp);
      end;
    sl.Text := temp;

    //Einzeilige Kommentare und Leerzeilen entfernen
    for i := sl.Count-1 downto 0 do
      begin
        start := Pos(cmOneLine,Trim(sl[i]));
        case start of
          0: if Length(Trim(sl[i])) = 0 then
               sl.Delete(i);
          1: sl.Delete(i);
          else
            begin
              temp := sl[i];
              System.Delete(temp,start,Length(temp));
              sl[i] := temp;
            end;
        end;
      end;
  finally
    sl.EndUpdate;
  end;
end;

DerAndereMicha 7. Aug 2008 07:10

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Vielen Dank für Eure viele Antworten und Anregungen, ich werde mir alles im Laufe des Tages mal anschauen und meine Fkt. evtl. entsprechend ändern.

Gruß
Micha

nahpets 7. Aug 2008 07:58

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Hallo,

mir ist da diese Nacht noch was eingefallen:

Meine oben "aufgeführte" Logik(?) scheitert bei

SQL-Code:
Select
Daten /* ab hier jetzt auswählen
-- ,daten1 
-- ,daten2 
-- ,daten3 
-- Bitte das Datumsformat beachten !! */ from
where spalte1 = 'xyz' /* das ist jetzt Kommentar */ and spalte2 = 42
and datum > '01.01.1900' -- das ist ein Datum für irgendwaszumausschließen
Daher noch ein Vorschlag:

per globaler Ersetzung alle /* in "Zeilenvorschub /* Zeilenvorschub" ändern, ebenso alle */ in "Zeilenvorschub */ Zeilenvorschub" ändern, damit hast Du dann alle Kommentare der *-Sorte am Zeilenanfang, hierdurch dürfte das finden der Kommentare und das Erkennen von Anfang und Ende einfacher werden. Probleme bleiben dennoch:

SQL-Code:
Select * from tabelle where sqlstring like '%/*%'
Da scheitert auch diese Logik. Wie weit musst Du das mit dem Rauswerfen der Kommentare treiben? Und warum müssen sie raus?
Bei Oracle bekämst Du da noch ein zusätzliches Problem: Hinweise an den Optimizer stehen nämlich auch in Kommentaren und die rauszuwerfen wäre suboptimal. Wahrscheinlich mache ich hier aber gerade Baustellen auf, die ruhig zugelassen werden können.
Und ich befürchte, dass hat alles nichts mit dem Speicherproblem zu tuen. Wie groß sind die von Dir zu bearbeitenden Statements und wieviele sind es?

Stephan


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:45 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz