![]() |
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 |
AW: Unerwarteter OutOfMemory-Fehler
Lies dir mal folgendes durch:
![]() |
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
![]() |
AW: Unerwarteter OutOfMemory-Fehler
gsh hat es doch schon beantwortet.
Delphi als 32 - Bit Anwendung teilt sich die 2 GB mit anderen 32 - Bitprozessen |
AW: Unerwarteter OutOfMemory-Fehler
Da wird nichts geteilt. Jeder Prozess hat seine 4GB bzw. 2GB virtuellen Adressraum.
|
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 |
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.
|
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 |
AW: Unerwarteter OutOfMemory-Fehler
Zitat:
|
AW: Unerwarteter OutOfMemory-Fehler
Zitat:
|
AW: Unerwarteter OutOfMemory-Fehler
@Luckie
Das versteh ich ehrlichgesagt nicht, was für Symptome meinst du? |
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.
|
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 |
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 |
AW: Unerwarteter OutOfMemory-Fehler
Wie lädst du denn die Daten.
|
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.
|
AW: Unerwarteter OutOfMemory-Fehler
Zitat:
Schau dir doch mal mit einem Prozess Explorer an was selbst ein einfaches "Hello World" Programm so für DLL's verpasst bekommt. |
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?
|
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. |
AW: Unerwarteter OutOfMemory-Fehler
Zitat:
|
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.
|
AW: Unerwarteter OutOfMemory-Fehler
Zitat:
|
AW: Unerwarteter OutOfMemory-Fehler
Stimmt, hast du ein Vorschlag was noch ein Kriterium sein könnte?
|
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 |
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:
oder hier die ganz genaue Variante mit MD5, CRC32 und Größe
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;
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