Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
Hallo Micha,
ich vermute das ist nicht so gewollt: Zitat:
und ob es hiermit keinen Ärger gibt weiß ich auch nicht: Zitat:
Delphi-Quellcode:
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.
Select Daten
/* ab hier jetzt auswählen -- ,daten1 -- ,daten2 -- ,daten3 -- Bitte das Datumsformat beachten !! */ from ....... Gruß K-H |
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
:stupid:
|
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
Hallo p80286,
1. Ich denke durch die Bedingung
Delphi-Quellcode:
in der WHILE-Schleife, sollte die IF-Anweisung
(pos('*/',Temp)>pos('/*',Temp))
Delphi-Quellcode:
gar nicht auslösen - ist quasi eine Altlast.
if en=0 then en:=Length(Temp);
2. Warum sollte die Zeile
Delphi-Quellcode:
Ärger bringen?
enStr:= copy(Temp,en+2,Length(Temp));
3. Da geb ich Dir recht und werd mir was überlegen. Gruß Micha |
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
Hallo spaxxn,
na und? Gruß Micha |
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:
um ganz sicher zu gehen
if startpos<=length(daten) then
dummy:=copy(daten,startpos,lange);
Delphi-Quellcode:
oder
if (startpos>length(daten)) and (lange>0) then
dummy:=copy(daten,startpos,lange);
Delphi-Quellcode:
Gruß
if startpos+lange-1<=length(daten) then
dummy:=copy(daten,startpos,lange); K-H |
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
Hallo,
Zitat:
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:
Stelle mir das in etwa so vor (nicht getestet!!!)
Select
Daten /* ab hier jetzt auswählen -- ,daten1 -- ,daten2 -- ,daten3 -- Bitte das Datumsformat beachten !! */ from .......
Delphi-Quellcode:
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.
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; 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. |
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 |
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; |
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 |
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
Hallo,
mir ist da diese Nacht noch was eingefallen: Meine oben "aufgeführte" Logik(?) scheitert bei
SQL-Code:
Daher noch ein Vorschlag:
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 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:
Da scheitert auch diese Logik. Wie weit musst Du das mit dem Rauswerfen der Kommentare treiben? Und warum müssen sie raus?
Select * from tabelle where sqlstring like '%/*%'
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 00:23 Uhr. |
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