AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein GetMem mit Delphi 2010 unter Windows 8
Thema durchsuchen
Ansicht
Themen-Optionen

GetMem mit Delphi 2010 unter Windows 8

Ein Thema von maxbafh · begonnen am 17. Sep 2014 · letzter Beitrag vom 18. Sep 2014
Antwort Antwort
Seite 1 von 2  1 2      
maxbafh

Registriert seit: 23. Jan 2014
6 Beiträge
 
#1

GetMem mit Delphi 2010 unter Windows 8

  Alt 17. Sep 2014, 14:53
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: GetMem mit Delphi 2010 unter Windows 8

  Alt 17. Sep 2014, 14:59
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.
* ...
$2B or not $2B

Geändert von himitsu (17. Sep 2014 um 15:17 Uhr)
  Mit Zitat antworten Zitat
maxbafh

Registriert seit: 23. Jan 2014
6 Beiträge
 
#3

AW: GetMem mit Delphi 2010 unter Windows 8

  Alt 17. Sep 2014, 15:04
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.

Geändert von maxbafh (17. Sep 2014 um 15:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: GetMem mit Delphi 2010 unter Windows 8

  Alt 17. Sep 2014, 15:12
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: GetMem mit Delphi 2010 unter Windows 8

  Alt 17. Sep 2014, 15:22
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.


Was noch dazu zu sagen ist mit XE5 kompiliert funktioniert der Source.
Evtl. als 64-Bit Anwendung kompiliert?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: GetMem mit Delphi 2010 unter Windows 8

  Alt 17. Sep 2014, 15:26
Was noch dazu zu sagen ist mit XE5 kompiliert funktioniert der Source.
andere RTL/VCL = andere Dinge im RAM
$2B or not $2B

Geändert von himitsu (17. Sep 2014 um 15:29 Uhr)
  Mit Zitat antworten Zitat
maxbafh

Registriert seit: 23. Jan 2014
6 Beiträge
 
#7

AW: GetMem mit Delphi 2010 unter Windows 8

  Alt 17. Sep 2014, 15:27
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: GetMem mit Delphi 2010 unter Windows 8

  Alt 17. Sep 2014, 15:31
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.

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.
$2B or not $2B
  Mit Zitat antworten Zitat
maxbafh

Registriert seit: 23. Jan 2014
6 Beiträge
 
#9

AW: GetMem mit Delphi 2010 unter Windows 8

  Alt 17. Sep 2014, 16:59
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.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#10

AW: GetMem mit Delphi 2010 unter Windows 8

  Alt 17. Sep 2014, 19:17
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,
...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:17 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