Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Unerwarteter OutOfMemory-Fehler (https://www.delphipraxis.net/155055-unerwarteter-outofmemory-fehler.html)

blablab 6. Okt 2010 15:08

Unerwarteter OutOfMemory-Fehler
 
Hallo!

Ich lade Dateien in den Speicher und benutze dazu ziemlich viel Ram. Ich würde gerne in dem Programm eine Maximalgrenze an genutzem Ram angeben, also z.B. FREE_MEM = 0.12 -> 12% des Rams werden freigelassen. Das komische ist nur, ich habe circa 2700MB verfügbaren Ram, ab 1900MB reservierten Ram kommt aber plötzlich die Meldung "OutOfMemory". Das bedeutet zu dem Zeitpunkt der OutOfMemory-Meldung habe ich laut Windows Taskmanager noch ca. 800MB frei...

Weiß jemand was das zu bedeuten hat???

Grüße
blablab

gsh 6. Okt 2010 15:16

AW: Unerwarteter OutOfMemory-Fehler
 
Lies dir mal folgendes durch: http://support.microsoft.com/kb/2267427/de

Luckie 6. Okt 2010 15:35

AW: Unerwarteter OutOfMemory-Fehler
 
Das muss nichts heißen. Eventuell ist der Adressraum nur zu stark fragmentiert, so dass ein Block in der angeforderten Größe nicht reserviert werden kann. Und außerdem wenn dein Prozess nicht aktiv ist belegt er keinen nennenswerten physischen Speicher. Siehe dazu auch http://www.michael-puff.de/Artikel/W...nagement.shtml

Bummi 6. Okt 2010 15:40

AW: Unerwarteter OutOfMemory-Fehler
 
gsh hat es doch schon beantwortet.
Delphi als 32 - Bit Anwendung teilt sich die 2 GB mit anderen 32 - Bitprozessen

Luckie 6. Okt 2010 15:43

AW: Unerwarteter OutOfMemory-Fehler
 
Da wird nichts geteilt. Jeder Prozess hat seine 4GB bzw. 2GB virtuellen Adressraum.

rollstuhlfahrer 6. Okt 2010 16:15

AW: Unerwarteter OutOfMemory-Fehler
 
falls du mehr RAM brauchst, gibt es einen Kompilerschalter, der dir ermöglicht, bis zu 3GB Ram zu benutzen. Diesen kannst du mal ausprobieren. Allerdings wirst du ihn suchen müssen, was sich als nicht sonderlich schwer herausstellen wird. Der Anfang ist übrigens {$IMAGEBASE ...

Bernhard

Luckie 6. Okt 2010 16:18

AW: Unerwarteter OutOfMemory-Fehler
 
Davon ist aber tunlichst abzuraten. Ich habe bisher noch keine Anwendung gesehen, die diesen Schalter benötigt hätte. Wenn der Speicher ausgeht, dann liegt es meist an einer schlampigen Programmierung.

blablab 8. Okt 2010 09:43

AW: Unerwarteter OutOfMemory-Fehler
 
Vielen Dank für die vielen Antworten!

Ich hab jetzt eine Grenze von 1800MB eingestellt. Es ist zwar etwas komisch, dass es schon knapp unter 2GB eine OutOfMemory Eycption gibt, aber wenigstens funktioniert es jetzt :D

Bernhard Geyer 8. Okt 2010 09:47

AW: Unerwarteter OutOfMemory-Fehler
 
Zitat:

Zitat von blablab (Beitrag 1054448)
Es ist zwar etwas komisch, dass es schon knapp unter 2GB eine OutOfMemory ...

Siehe Post #3. Speicherfragmentierung. Du kannst noch 200 MB freien Prozesspeicher haben. Nützt dir aber nix wenn dieser nur jeweils als 1 kB-Blöcke verfügbar sind und du 50 MB am Stück benötigst.

Luckie 8. Okt 2010 09:52

AW: Unerwarteter OutOfMemory-Fehler
 
Zitat:

Zitat von blablab (Beitrag 1054448)
Ich hab jetzt eine Grenze von 1800MB eingestellt.

Ich bin mir ziemlich sicher, dass du damit nur die Symptome unterdrückst.

blablab 8. Okt 2010 09:59

AW: Unerwarteter OutOfMemory-Fehler
 
@Luckie
Das versteh ich ehrlichgesagt nicht, was für Symptome meinst du?

Luckie 8. Okt 2010 10:01

AW: Unerwarteter OutOfMemory-Fehler
 
Dass dir der Speicher ausgeht. Ich bin mir ziemlich sicher, dass du Speicher nicht wieder sauber freigibst oder andere Speicherlücken hast.

Sir Rufo 8. Okt 2010 10:07

AW: Unerwarteter OutOfMemory-Fehler
 
Ich würde mal eher vermuten, dass er hier die Grenzen von Delphi (wegen rein 32bit) sprengt.

Wenn er alle Daten im Speicher halten will (oder muss), dann ist er auf der 32bit-Ebene leider fehl am Platz und somit hat sich dann auch Delphi erledigt.

Also Konzept überdenken oder Programmiersprache/Compiler (und natürlich BS) wechseln.

Das ist Ursachen-Bekämpfung alles andere ist Symptom-Behandlung

blablab 8. Okt 2010 10:15

AW: Unerwarteter OutOfMemory-Fehler
 
Ne, das passt schon. Die Anwendung braucht 10MB, dann drück ich auf einen Knopf, der Speicherbedarf steigt auf 2GB an (das ist nur ein künstlicher Extremfall, im normalfall bleibt es eher bei wenigen 100MB oder so) und wenn die Berechnung fertig ist bleiben wieder 10MB Speicherbedarf übrig...
[Edit]Und ich allokier wirklich 2GB Speicher, es ist also keine Fragmentierung

Luckie 8. Okt 2010 10:18

AW: Unerwarteter OutOfMemory-Fehler
 
Wie lädst du denn die Daten.

blablab 8. Okt 2010 10:45

AW: Unerwarteter OutOfMemory-Fehler
 
Mit TFileStream. Aber das ist doch nicht wichtig. Ich speicher die halbe Festplatte im Ram zwischen, deshalb brauch ich so viel Speicher und deshalb möchte ich eine Maximalgrenze damit es keine OutOfMemory-Exception gibt.

Bernhard Geyer 8. Okt 2010 10:53

AW: Unerwarteter OutOfMemory-Fehler
 
Zitat:

Zitat von blablab (Beitrag 1054457)
[Edit]Und ich allokier wirklich 2GB Speicher, es ist also keine Fragmentierung

Du vergisst da jeder Prozess unter Windows zwangsweise einen Rattenschwanz von DLL geladen bekommt. Sei es nun die DLLs die man selbst benötigt (user32.dll, ....) als auch die ganzen DLL's die irgendwelche Anwendungen/Virenscanner/... denken das man benötigen würde.
Schau dir doch mal mit einem Prozess Explorer an was selbst ein einfaches "Hello World" Programm so für DLL's verpasst bekommt.

Luckie 8. Okt 2010 10:54

AW: Unerwarteter OutOfMemory-Fehler
 
Du bist sehr sparsam mit Informationen. Warum die halbe Festplatte zwischenspeichern? Was machst du mit den Daten und wie machst du das?

blablab 8. Okt 2010 12:04

AW: Unerwarteter OutOfMemory-Fehler
 
Das Programm sucht nach Datei-Duplikaten in einem bestimmten Ordner. Wenn 2 Dateien dieselbe Größe haben, vergleicht er die Dateien um dann zu entscheiden ob sie gleich sind oder nicht. Wenn mehrere Dateien dieselbe Größe haben, muss jede mit jeder verglichen werden. Deshalb behalte ich in diesem Fall die Datei oder ein Teil der Datei im Speicher damit die zukünftigen Vergleiche schneller gehen.
Wenn man als Ordner die ganze Festplatte auswählt und viel Dateien mit gleicher Größe hat, dann kann der verwendete Speicher ziemlich ansteigen. Und in diesem Fall möchte ich dann auf das Zwischenspeichern verzichten bevor es zum OutOfMemory kommt.

Sir Rufo 8. Okt 2010 12:09

AW: Unerwarteter OutOfMemory-Fehler
 
Zitat:

Zitat von blablab (Beitrag 1054506)
Das Programm sucht nach Datei-Duplikaten in einem bestimmten Ordner. Wenn 2 Dateien dieselbe Größe haben, vergleicht er die Dateien um dann zu entscheiden ob sie gleich sind oder nicht. Wenn mehrere Dateien dieselbe Größe haben, muss jede mit jeder verglichen werden. Deshalb behalte ich in diesem Fall die Datei oder ein Teil der Datei im Speicher damit die zukünftigen Vergleiche schneller gehen.
Wenn man als Ordner die ganze Festplatte auswählt und viel Dateien mit gleicher Größe hat, dann kann der verwendete Speicher ziemlich ansteigen. Und in diesem Fall möchte ich dann auf das Zwischenspeichern verzichten bevor es zum OutOfMemory kommt.

Hast du schon mal was von Hash gehört?

blablab 8. Okt 2010 12:19

AW: Unerwarteter OutOfMemory-Fehler
 
Hab ich auch schon dran gedacht, aber ich find das ist nicht unbedingt nötig. Wenn es wirklich immer zum OutOfMemory käme, würde ich es mit Hash probiern (auch wenn ich mich damit nicht auskenne). Aber da das ja eher eine Ausnahmesituation ist reicht es mir so. Mir ist es dann nur wichtig, dass es nicht zu einem Fehler kommt und das Programm dann abstürzt.

Luckie 8. Okt 2010 12:26

AW: Unerwarteter OutOfMemory-Fehler
 
Zitat:

Zitat von blablab (Beitrag 1054506)
Das Programm sucht nach Datei-Duplikaten in einem bestimmten Ordner. Wenn 2 Dateien dieselbe Größe haben, vergleicht er die Dateien um dann zu entscheiden ob sie gleich sind oder nicht.

An Hand der Größe zu entscheiden, ob Dateien eventuell gleich sein könnten, ist aber kein sehr gutes Kriterium. Ich möchte nicht wissen, wie viele Dateien mit der Größe von 1 KB ich auf der Platte habe.

blablab 8. Okt 2010 13:08

AW: Unerwarteter OutOfMemory-Fehler
 
Stimmt, hast du ein Vorschlag was noch ein Kriterium sein könnte?

xZise 8. Okt 2010 13:14

AW: Unerwarteter OutOfMemory-Fehler
 
Moin,
naja ein Hash erstellen, wenn der immer noch gleich ist, die Dateien bitweise überprüfen. Außerdem kannst du nicht alle Dateien in den RAM laden, wenn ich hier schon sehe, das ich teilweise Dateien von 11 GiB Größe habe.

MfG
Fabian

Sir Rufo 8. Okt 2010 13:57

AW: Unerwarteter OutOfMemory-Fehler
 
Wenn man von einer Datei einen MD5-Hash erstellt und dazu nochmal einen CRC32 und diese beiden Werte gleich sind nebst der Größe, dann kann man die Datei getrost als gleich ansehen

Für einen direkten Vergleich der dann noch vorhandenen Dateien kann man mittels FileStream lösen indem dann Byte für Byte verglichen wird. Dazu werden die Dateien aber nicht in den Speicher geladen.

BTW. es gibt da Backup-Programme, die sehr gut funktionieren, die entscheiden darüber, ob die Datei schon gesichert ist oder nicht über Hash-Werte.
Delphi-Quellcode:
uses IdHash, IdHashMessageDigest;

{...}

function MD5FromFile( const FileName : string ) : string;
  var
    idmd5 : TIdHashMessageDigest5;
    fs : TFileStream;
  begin
    idmd5 := TIdHashMessageDigest5.Create;
    fs := TFileStream.Create( FileName, fmOpenRead or fmShareDenyWrite );
    try
      Result := idmd5.HashStreamAsHex( fs );
    finally
      fs.Free;
      idmd5.Free;
    end;
  end;
oder hier die ganz genaue Variante mit MD5, CRC32 und Größe
Delphi-Quellcode:
uses IdHash, IdHashMessageDigest;

{...}

function MD5H32SizeFromFile( const FileName : string ) : string;
  var
    idmd5 : TIdHashMessageDigest5;
    idh32 : TIdHash32;
    fs : TFileStream;
  begin
    idmd5 := TIdHashMessageDigest5.Create;
    idh32 := TIdHash32.Create;
    fs := TFileStream.Create( FileName, fmOpenRead or fmShareDenyWrite );
    try
      fs.Position := 0;
      Result := idmd5.HashStreamAsHex( fs );
      fs.Position := 0;
      Result := Result + idh32.HashStreamAsHex( fs );
      Result := Result + IntToHex( fs.Size, 8 );
    finally
      fs.Free;
      idmd5.Free;
      idh32.Free;
    end;
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:01 Uhr.

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