AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

kleines Programm - riesiger Prozess

Ein Thema von sieppl · begonnen am 25. Aug 2004 · letzter Beitrag vom 26. Aug 2004
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: kleines Programm - riesiger Prozess

  Alt 26. Aug 2004, 00:49
Ey das eine Byte...

Dann halt (Cardinal div 2)-1
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#12

Re: kleines Programm - riesiger Prozess

  Alt 26. Aug 2004, 01:18
das klappt auch nicht. siehe screenshot!

lass ich alles in der funktion weg, und deklarier nur den typ, dann gehts wiederum.

edit: kann das an 512 MB RAM + 7XX MB Pagefile liegen, dass das deshalb nichts wird? aber warum krepiert der dann, bevor er es probiert (keine festplattenzugriffe --> keine pagefile)
Miniaturansicht angehängter Grafiken
error_196.png  
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#13

Re: kleines Programm - riesiger Prozess

  Alt 26. Aug 2004, 01:24
So:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type
  PDickesDingen = ^TDickesDingen;
  TDickesDingen = array[0..High(Integer) - 1] of Byte;
var
  Foo: PDickesDingen;
begin
  new(Foo);
end;
Bekomme ich eine OutOfMemory Exception.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#14

Re: kleines Programm - riesiger Prozess

  Alt 26. Aug 2004, 01:27
so klappts bei mir auch (mit der "korrekten" exception) aber wieder bevor er überhaupt versucht hat, die pagefile vollzukleistern
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#15

Re: kleines Programm - riesiger Prozess

  Alt 26. Aug 2004, 02:27
Zitat von nailor:
das klappt auch nicht. siehe screenshot!
Ich gehe mal davon aus, dass Du weder die Größe des Stacks angepasst hat, noch das System mit /3GB gestartet hast, noch im PE-Header das Flag gesetzt hast, das die Anwendung mit mehr als 2GB zurechtkommt... (und selbst dann ist es unwahrscheinlich dass das System solch einen grossen Stack allozieren kann/will).

Solche Arrays definiert man normalerweise nur als Hilfstypen, um ohne Auslösen der Überlauf/Bereichsprüfung auf Arrays unbekannter Länge zuzugreifen.
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: kleines Programm - riesiger Prozess

  Alt 26. Aug 2004, 02:54
Okay, jetzt wirds interessant.
Folgendes kompiliert bei mir noch so gerade eben - ein Element mehr, und das Teil bringt eine AV:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type
  TDickesDingen = array[0..$FC5AF] of Byte;
var
  Foo: TDickesDingen;
  i: Integer;
begin
  for i := 0 to Length(Foo)-1 do
    Foo[i] := 0;
end;
Das macht 1.033.648 Elemente á 1 Byte, also ziemlich genau 1 Megabyte.
Der Stack ist auf Max. 1.048.576 Byte. Na, was fällt auf?
Ohne Zugriff, also die bloße Deklaration klappt bis 2Gig!

Dann dieses:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type
  PDickesDingen = ^TDickesDingen;
  TDickesDingen = array[0..$40F2FFF7] of Byte;
var
  Foo: PDickesDingen;
begin
  new(Foo);
end;
Wird auch gerade noch korrekt ausgeführt.

Kombiniert man dies, kann man mit der Schleife tatsächlich durch das Array im 2. Code durchlaufen, da hier ganz offensichtlich nicht der Stack bemüht wird:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type
  PDickesDingen = ^TDickesDingen;
  TDickesDingen = array[0..$40F2FFF7] of Byte;
var
  Foo: PDickesDingen;
  i: Integer;
begin
  new(Foo);
  for i := 0 to Length(Foo^)-1 do
    Foo^[i] := 0;
end;
Aaaaber: 0..$40F2FFF7 = 1.089.667.064 Byte und das sind 1,015 Gigabyte => Ich habe 1 Gig RAM. Aber das Teil verbrauchte zur Laufzeit nur kurzzeitig > 700MB, und dann rutschte es gewaltig auf ~20 bis 50MB runter, mitten in der Schleife.
(Messung per Taskmanager )

Es müsste ja theoretisch noch ein Gig mehr gehen... Haut aber partout nicht hin, obwohl mein Pagefile auf 4Gig steht.
Auch mit einer 2. Variable dieses Typs und mit new erzeugt führt zu einer "Out of Memory".

Wenn ich mich recht erinnere, dann hatte ich schon mal ein 3-dimensionales statisches Array verwendet, bei dem mir die 2 Gig-Grenze begenete, und ich hatte es dann auf "knapp darunter" verkleinert, und auch damit gearbeitet. Allerdings als globale Variable, und somit ja nicht auf dem Stack, und auch nicht als Pointer mit new, sondern direkt - aber wieso ging das hier jetzt nicht?
(Kann aber auch sein, dass ich mich irre - ist schon etwas her)

Darf also ein Prozess die Größe des vorhadenen RAMs nicht überschreiten, so dass immer die gesamte Prozess rein passt? Dann werden auch immer nur ganze Prozesse ausgelagert?? Wäre doch birnig, oder?

Ich schnall's glaub ich nicht und geh mal besser ins Bett...
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#17

Re: kleines Programm - riesiger Prozess

  Alt 26. Aug 2004, 09:34
okay, danke erstmal.
Ich werde mal meine deklarationen zusammenrechnen und zusätzlich mal schauen, ob meine Typauswahl immer die treffendste war. Dankeschön!
Sebastian
  Mit Zitat antworten Zitat
Vjay

Registriert seit: 2. Dez 2003
Ort: Berlin/Eschede
481 Beiträge
 
Delphi 7 Professional
 
#18

Re: kleines Programm - riesiger Prozess

  Alt 26. Aug 2004, 12:02
Im Taskmanager werden soweit ich weiss auch verwendete DLLs mit angerechnet user32.dll z.B.

Da diese aber eh schon geladen sind, müsstest du dir die allocierten bereiche des Speichers mal genau anschauen und diese Dinge abziehen.

Kann dieses Norton Systeminfo z.B.
Wer später bremst ist eher tot.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 13:15 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