Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   GetMem mit Delphi 2010 unter Windows 8 (https://www.delphipraxis.net/181912-getmem-mit-delphi-2010-unter-windows-8-a.html)

maxbafh 17. Sep 2014 13:53

GetMem mit Delphi 2010 unter Windows 8
 
Habe das Problem, das GetMem unter Windows 8 mit Delphi 2010 compiliert bei 1GB sagt out of memory. Dies passiert aber nur für den selben Speicherbereich. Wenn ich einen zweiten Speicherbereich alloziere hab ich as Problem nicht, dann kann ich weiter 1GB allozieren.

Kennt ihr dafür einen Work-Arround. Danke für eure Hilfe.

maxbafh

himitsu 17. Sep 2014 13:59

AW: GetMem mit Delphi 2010 unter Windows 8
 
Weil dein Programm nunmal nur 2 GB an virtuellem RAM zur Verfügung hat.
Dann liegen in dem Speicher "verteilt" bereits die EXE, DLLs und die sonstigen reservierten Speicherblöcke usw.

Und nun versuch mal in diese "fragmentierten" 2 GB noch einen "zusammenhängenden" 1 GB-Block zu finden.


Nach meiner Erfahrung wird es ab 500 MB immer schwerer etwas zu finden und wenn kein zusammenhängender Block mehr existiert, welcher mindestens die 1 GB aufnehmen kann, dann knallt es eben.
Im Extremfall reichen nur 2x je 1 Byte gut verteilt, um deinen 1 GB-Block im verfügbaren 2 GB-Bereich zu blockieren.


Lösungen:
* Überlegen ob man überhaupt 1 GB an Arbeitspeicher benötigt und versuchen mit weniger auszukommen
* Aufteilen -> mehrere kleinere Blöcke, die zusammen 1 GB beinhalten
* Auslagern -> z.B. MMF (MemoryMappedFiles), wovon nur ein aktuell benötigter kleiner Teil in deinen virtuellen RAM gemappt wird. (und der Rest kann entweder in einer Datei oder im physischen RAM rumliegen)
* Ein 64-Bit-Programm schreiben ... das hat einen größeren virtuellen RAM, womit die Fragmentierung nicht so schnell zum Problem wird.
* ...

maxbafh 17. Sep 2014 14:04

AW: GetMem mit Delphi 2010 unter Windows 8
 
Das interessante ist aber, das es bis Windows 7 problemlos klappt aber unter Windows 8 knallt es. Das ist der einzige Unterschied zwischen den beiden Systemen ;-)

Wie soll ich sonst ein Bild laden, wenn ich es nicht komplett in den Memory legen kann? Physikalische System-Memory steht ja genug zur Verfügung.

Was noch dazu zu sagen ist mit XE5 kompiliert funktioniert der Source. Ich will nur meine alte App nicht auf XE5 umändern, da sie eigentlich EOL ist.

himitsu 17. Sep 2014 14:12

AW: GetMem mit Delphi 2010 unter Windows 8
 
Unterschiede:
Die DLLs werden nicht immer an der selben Stelle geladen, und es gibt sogar andere DLLs in beiden Systemen. (es gibt sogar ein Sicherheitssystem, welches die DLLs immer mal wieder verschiebt, so daß es Hacker/Viren schwerer haben, über eine hardgecodete Adresse einfach so irgendwas böses zu machen.
Auch GetMem un Konsorten geben nicht immer die selben Speicherpositionen zurück, bei jedem Programmstart, womit alle anderen Speicherblöcke auch gerne mal anders erteilt sind.

Fazit: Du hattest Glück, daß es nicht vorher schon ab und an mal geknallt hat.



PS: Hatte meinen letzte Beitrag zwischenzeitlich nochmal erweitert.

Bernhard Geyer 17. Sep 2014 14:22

AW: GetMem mit Delphi 2010 unter Windows 8
 
Zitat:

Zitat von maxbafh (Beitrag 1272887)
Das interessante ist aber, das es bis Windows 7 problemlos klappt aber unter Windows 8 knallt es. Das ist der einzige Unterschied zwischen den beiden Systemen ;-)

Einmal Win7, einmal Win8. Dieser "einzige" Unterschied ist das du 2 vollkommen unterschiedliche System vergleicht bei denen keine geladene Systemdatei gleich ist.


Zitat:

Zitat von maxbafh (Beitrag 1272887)
Was noch dazu zu sagen ist mit XE5 kompiliert funktioniert der Source.

Evtl. als 64-Bit Anwendung kompiliert?

himitsu 17. Sep 2014 14:26

AW: GetMem mit Delphi 2010 unter Windows 8
 
Zitat:

Zitat von maxbafh (Beitrag 1272887)
Was noch dazu zu sagen ist mit XE5 kompiliert funktioniert der Source.

andere RTL/VCL = andere Dinge im RAM

maxbafh 17. Sep 2014 14:27

AW: GetMem mit Delphi 2010 unter Windows 8
 
Zitat:

Zitat von maxbafh (Beitrag 1272887)
Was noch dazu zu sagen ist mit XE5 kompiliert funktioniert der Source.

Evtl. als 64-Bit Anwendung kompiliert?[/QUOTE]

Da klappt es in beiden Varianten sowohl als 64bit als auch als 32bit Version.

himitsu 17. Sep 2014 14:31

AW: GetMem mit Delphi 2010 unter Windows 8
 
Wie gesagt, ein einziges Byte an anderer/neuer Stelle im RAM und schon kann es das gewesen sein.

Mit FastMM kann man sich gern eine Memory-Map von seinem Programm generieren lassen und sieht dann wie/wo der Speicher belegt ist.

Zitat:

Zitat von maxbafh (Beitrag 1272896)
Da klappt es in beiden Varianten sowohl als 64bit als auch als 32bit Version.

Warum es mit 64 Bit klappt, hatte ich ja bereits geschrieben.


Nimm dir einen der abschließenden Punkte von Post #2 und schon ist das Problem behoben. :roll:

maxbafh 17. Sep 2014 15:59

AW: GetMem mit Delphi 2010 unter Windows 8
 
Alles zusammen eine nette Idee, kann ich jedoch nicht in der Praxis umsetzen. Nicht weil ich es nicht kann, sondern weil es nicht klappt.

*) MMF - Komprimiertes Bild ist 500MB auf der HDD => unkomprimiert > 1GB brauch es aber unkomprimiert damit ich damit arbeiten kann - MMF kann ich aber nur 1:1 Mappen und nicht komprimiert auf unkomprimiert.

*) Aufteilen - ja ein gesamtes Image kann ich nicht aufteilen auf zwei Speicherbereiche, das braucht einen zusammenhängenden Memory.

*) Mit weniger Aus zu kommen - gut gemeint, schlecht in der Umsetzung.

*) 64bit App - ja für die neue Version, nur nicht für die EOL Version mehr.

jbg 17. Sep 2014 18:17

AW: GetMem mit Delphi 2010 unter Windows 8
 
Bei einem 32-Bit Programm kann man noch das Linker-Flag IMAGE_FILE_LARGE_ADDRESS_AWARE setzen. Dadurch erhöht sich der Adressraum von 2 GB auf 3GB. Vorraussetzung ist ein 64-Bit Windows oder ein 32-Bit Windows mit dem /3GB Boot-Schalter.

Das Programm und all seine Komponenten und DLLs müssen dann aber auch mit Pointern größer 2 GB richtig umgehen können, was z.B. bei "Integer(P1) - Integer(P2)" nicht der Fall ist (Overflow-Exception).

Folgende Zeile in die DPR Datei einfügen
Delphi-Quellcode:
program MyApp;

{$SetPeFlags $20} // IMAGE_FILE_LARGE_ADDRESS_AWARE

uses
  Forms,
...

Sherlock 18. Sep 2014 07:36

AW: GetMem mit Delphi 2010 unter Windows 8
 
Stichwort "EOL": Es ist also eine rein akademische Frage gewesen? Entweder das Programm ist am Ende, oder eben nicht. Wenn es tot ist, wurde alles bereits gesagt. Lebt es noch, dann stell halt auf XE5 um, offensichtlich kompiliert es ja bereits - der Rest dürfte dann auch mit vertretbarem Aufwand machbar sein. Für ein totes Programm ist es im übrigen ein leichtes zu sagen "Läuft nur bis Windows 7".

Sherlock

Blup 18. Sep 2014 11:48

AW: GetMem mit Delphi 2010 unter Windows 8
 
Zitat:

Zitat von maxbafh (Beitrag 1272918)
*) Aufteilen - ja ein gesamtes Image kann ich nicht aufteilen auf zwei Speicherbereiche, das braucht einen zusammenhängenden Memory.

Eine Paintbox, zwei oder mehr Bitmaps und im OnPaint an der richtigen Stelle zeichnen.
Was glaubst du wie Bildbearbeitungssoftware mit gescannten Bildern umgeht, die teilweise mehrere hundert MB groß sind.

Bernhard Geyer 18. Sep 2014 12:25

AW: GetMem mit Delphi 2010 unter Windows 8
 
Zitat:

Zitat von Blup (Beitrag 1272981)
Was glaubst du wie Bildbearbeitungssoftware mit gescannten Bildern umgeht, die teilweise mehrere hundert MB groß sind.

Teilweise haben sie den gleichen Fehler. Paint.net kracht(e vor einiger Zeit) genauso.

himitsu 18. Sep 2014 12:26

AW: GetMem mit Delphi 2010 unter Windows 8
 
Google Maps und Co. haben die Welt auch nicht in einem großen Bild. :angel:

Sherlock 18. Sep 2014 13:41

AW: GetMem mit Delphi 2010 unter Windows 8
 
Ausserdem konnten Bildbearbeitungen schon große Bilder bearbeiten als es nur 16 Bit OS gab.

Sherlock

brechi 18. Sep 2014 18:10

AW: GetMem mit Delphi 2010 unter Windows 8
 
Ich muss mich da den anderen anschließen. Lade nur Teile des Bildes, splitte es also ggf. in mehrere Kacheln auf und lade nur die benötigten. Halte das Bild ausserdem in mehreren Auflösungen vor.
Schreibt dir ne Unit zum Handling von großen Bildern (automatisches Zerlegen der Bilder, Skalierung etc.). Ich habe so schon mehrere GigaByte Orthofotos schnell geladen und gecached...


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 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