AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Fehlermeldung "Zu wenig Arbeitsspeicher"
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlermeldung "Zu wenig Arbeitsspeicher"

Ein Thema von DerAndereMicha · begonnen am 6. Aug 2008 · letzter Beitrag vom 7. Aug 2008
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#21

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"

  Alt 6. Aug 2008, 15:31
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
  Mit Zitat antworten Zitat
Benutzerbild von spaxxn
spaxxn

Registriert seit: 19. Nov 2004
253 Beiträge
 
Delphi XE2 Enterprise
 
#22

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"

  Alt 6. Aug 2008, 15:44
"Hey Süße,
hol mir mal was zu trinken! Du wirst schon wieder hässlich!"

Zitat eines Betrunkenen
  Mit Zitat antworten Zitat
Benutzerbild von DerAndereMicha
DerAndereMicha

Registriert seit: 1. Jul 2004
Ort: Berlin
208 Beiträge
 
Delphi 2007 Enterprise
 
#23

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"

  Alt 6. Aug 2008, 15:46
Hallo p80286,

1. Ich denke durch die Bedingung

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

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

2. Warum sollte die Zeile

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

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


Gruß
Micha
Der Weg ist das Ziel...
  Mit Zitat antworten Zitat
Benutzerbild von DerAndereMicha
DerAndereMicha

Registriert seit: 1. Jul 2004
Ort: Berlin
208 Beiträge
 
Delphi 2007 Enterprise
 
#24

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"

  Alt 6. Aug 2008, 15:46
Hallo spaxxn,

na und?

Gruß
Micha
Der Weg ist das Ziel...
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#25

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"

  Alt 6. Aug 2008, 15:58
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
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#26

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"

  Alt 6. Aug 2008, 16:13
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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#27

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"

  Alt 6. Aug 2008, 17:06
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#28

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"

  Alt 6. Aug 2008, 17:21
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von DerAndereMicha
DerAndereMicha

Registriert seit: 1. Jul 2004
Ort: Berlin
208 Beiträge
 
Delphi 2007 Enterprise
 
#29

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"

  Alt 7. Aug 2008, 07:10
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
Der Weg ist das Ziel...
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#30

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"

  Alt 7. Aug 2008, 07:58
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:

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 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