![]() |
Ramauslastung (bei ramgrößen >2gb)
heyho
da ich grad aufgrund eines rechnercrash mir einen "superrechner" zusammengebaut hab, ist mir aufgefallen das mein programm mit ramgrößen über 2gb nicht umgehen kann. zur zeit lese ich die auslastung so aus:
Delphi-Quellcode:
aber das packt nur bis 2gb ;) der rest wird abgeschnippelt.... das find ich nicht toll -> da steht jetzt einfach 0/2048mb da ...
var
memory: TMemoryStatus; begin //mem memory.dwLength := SizeOf(memory); GlobalMemoryStatus(memory); memtotal := memory.dwTotalPhys / 1024 / 1024; memavail := memory.dwAvailPhys / 1024 / 1024; memused := memory.dwMemoryLoad / 1024 / 1024; wie kann ich nun die vollen 2,5gb auslesen ? |
Re: Ramauslastung (bei ramgrößen >2gb)
Hm, sind die Zahlen in memory Integers oder DWords, wies dransteht? Wenns DWords sind, müsst das doch gehen..
|
Re: Ramauslastung (bei ramgrößen >2gb)
JEDES Programm kann mit RAM-Größen über 2GB umgehen, wenn es für 32bit oder größer kompiliert wurde.
Das Problem ist nur, daß die oberen 2GB immer für das System - sprich: den Kernel - reserviert sind. Die Einstellung kannst du über einen ![]() Achtung, die Einstellung der boot.ini ist abhängig von deinem System. Auf Win9x/Me kannst du sowieso keine >2GB nutzen, also ging ich in meiner Antwort von NT aus! Nachtrag: Ach ja, wenn es noch niemandem aufgefallen sein sollte: jeder einzelne Prozeß hat 4GB (gespalten in die 2 Teile für System und User) zur Verfügung. Und dreimal dürft ihr raten, wie das geht wenn ihr z.B. nur 512MB RAM und eine 512MB Auslagerungsdatei habt! |
Re: Ramauslastung (bei ramgrößen >2gb)
DerMemoryManager ist auf 2 GB begrenzt, aber man kann zumindestens FastMM (der BorlandMM kann es vrmutlich nicht richtig ... wenn überhaupt, da er eigentlich nicht dafür ausgelegt ist) auf 3 GB Win32 und bis zu 4 GB unter Win64 umstellen
schau dazu mal in die ReadMe > Stichwort "{$SetPEFlags $20}" |
Re: Ramauslastung (bei ramgrößen >2gb)
also mein winXP prof erkennt ja die 2,5gb einwandfrei!
nur eben mein programm liest nur 2048mb aus. also liegt das an dem memorymanager von borland? und zu dem bootini swichtes -> hab ich das richtig verstanden das winXP zb gar nicht mehr als 2gb von den 2,5 nutzen wird/kann ? ich bin grad etwas überfordert mit den infos ;) |
Re: Ramauslastung (bei ramgrößen >2gb)
Zitat:
![]() Wenn du die Funktionen von Delphi benutzt um RAM zu allozieren, bist du aber natürlich auf das beschränkt, was Delphi dir anbietet (siehe himitsus Post). Würdest du die üblichen Windows-Funktionen verwenden, solltest du dieses Problem ja nicht haben ... teste es einfach. Und nochmal: ein Usermode-Programm auf einer StiNo-Installation von Windows kann nicht mehr als 2GB allozieren, weil der Teil ab $80000000 eben dem Kernel gehört. Dort befinden sich (eingeblendet in den Prozeßspeicherraum) eingeblendet beispielsweise MMFs und Shared Sections von DLLs. Alles untendrunter ist sozusagen privat für den Prozeß. |
Re: Ramauslastung (bei ramgrößen >2gb)
Egal was dein Windows kann und was da eingestellt ist ... Standardmäßig ist die Größe auf 2 GB begrenzt ... also im positiven Bereich von LongInt.
füg einfach mal {$SetPEFlags $20} in deie DPR ein uns schau was passiert ... entweder der DelphiMM kann es, oder eben nicht ;) |
Re: Ramauslastung (bei ramgrößen >2gb)
ok das hab ich jetzt einfach ausprobiert und siehe da - es funktioniert.
wieso sind solche optionen nicht von anfang an aktiv? |
Re: Ramauslastung (bei ramgrößen >2gb)
Weil es sowas früher nicht gab und man Abwärtskompatibel sein will/muß :zwinker:
bei den 2 GB kann man z.B. ganz einfach prüfen, ob ein Pointer im "gültigen" Bereich ist also nicht negativ und nicht nil.
Delphi-Quellcode:
Tja und wenn jetzt soeine, oder so 'ne ähnlich Prüfung gemacht wird, dann wird dieses meinen der Pointer wäre falsch, sobald er >= 2 GB liegt ._.
// 2 Flags geprüft und fertsch
or &P, &P js @Fehler jz @Fehler |
Re: Ramauslastung (bei ramgrößen >2gb)
ich verstehe das jetzt nicht richtig.
wenn jetzt also das für >2,5gb compilierte programm auf einem systemläuft mit weniger als 2gb kommt es zu problemen? |
Re: Ramauslastung (bei ramgrößen >2gb)
Das sollte nicht geschehen, denn du kannst ja auch ein Pogramm, welches für <2 GB compiliert wurde auf einem System, mit weniger als 1 GB, laufen lassen ;)
Es kommen aber nicht alle Codes mit Pointern über 2GB klar ... du mußt also auch aufpassen, daß alle in deinem Programm (importierte Funktionen, geladene DLLs ...) auch dieses kann, wenn du diese Option aktivierst. |
Re: Ramauslastung (bei ramgrößen >2gb)
Pointer sind ja nur 32bit-Werte (auf einem 32bit-System). Sie können also theoretisch wie vorzeichenbehaftete oder vorzeichenlose Integer behandeltwerden, also wir LongInt vs. LongWord um beim Delphi-Jargon zu bleiben.
Das höchste Bit in diesem vorzeichenbehafteten Integer wird bei der Methode "two's complement" immer 1 sein, wenn der Wert negativ ist. Bei positiven Werten ist das höchste Bit immer 0. Wenn wir uns den Wert anschauen, der bei 32bit die Bitmaske des höchsten Bits darstellt, nämlich $80000000, sollte uns etwas auffallen - das ist genau unsere 2GB Grenze. Wie es scheint, benutzt Delphi also vorzeichenbehaftete Pointerwerte "by default", was sich aber umstellen läßt (wußte ich z.B. auch nicht, danke himitsu!). |
Re: Ramauslastung (bei ramgrößen >2gb)
Zitat:
(irgendwie ist das thema grad nen bömischer wald für mich ;) ) |
Re: Ramauslastung (bei ramgrößen >2gb)
Zitat:
(vorn/mitte/hinten auf die 2 GB bezogen) |
Re: Ramauslastung (bei ramgrößen >2gb)
also wenn ich zb später mal diesen hook mit einbauen will, das ich die tastenanschläge zähle (nicht auslese!) muss ich bei der dll dann auch diese anweisung mit einbauen, das er mehr als 2gb ram nutzt und sonst kommt es zu probleme - right?
|
Re: Ramauslastung (bei ramgrößen >2gb)
Nein, wozu?!
|
Re: Ramauslastung (bei ramgrößen >2gb)
dann hab ich das hier falsch verstanden:
Zitat:
|
Re: Ramauslastung (bei ramgrößen >2gb)
Ich denk/hoffe mal nicht, da die DLL ja ihren Speicher auch selber verwaltet (meistens).
Aber wozu willst du dieses Flag überhaupt setzten? Es kommt ja nicht gerade oft vor, daß ein Programm überhaupt mal den 2 GB-Adressraum voll ausnutzt. Na gut, ich hatte mal in 'nem Testprogramm "virtuell" die 2 GB vollgemacht und das bei nur 0,7 GB RAM+PageFile, aber dat war ja och nur 'ne Ausnahme ._. [add] es muß nicht aktiviert sein ... die DLL muß es nur verstehen/behandeln können, wenn sie mal auf speicher deiner EXE zugreift. |
Re: Ramauslastung (bei ramgrößen >2gb)
ich brauch gar nichtsoviel ram, ich will ja nur die auslastung auslesen! (minimiert brauch mein programm unter einem MB ;) )
das brauch ich für mein tool (siehe signatur ;) ) - und da gestern mein server kaputt gegangen ist, hab ich seinen ram mit in meine workstation gebaut und komme so auf 2,5gb, und da ist mir der fehler aufgefallen! |
Re: Ramauslastung (bei ramgrößen >2gb)
aber dafür brauchst du dieses Fläg doch nicht :zwinker:
Delphi-Quellcode:
var
memory: TMemoryStatus; begin memory.dwLength := SizeOf(memory); GlobalMemoryStatus(memory); memtotal := Cardinal(memory.dwTotalPhys) / 1024 / 1024; memavail := Cardinal(memory.dwAvailPhys) / 1024 / 1024; memused := Cardinal(memory.dwMemoryLoad) / 1024 / 1024; |
Re: Ramauslastung (bei ramgrößen >2gb)
doch, brauch ich eben doch.
weil sonst steht da bei mir 0 null von 2048 benutzt, und erst wenn der erste 512er teil voll ist, gehts los mit zb 36 von 2048 (wenn ich 548 mb auslastung habe!) mit gesetztem flag steht jetzt ordentlich 940 von 2559,48mb da hier mal nen screenshot von nem programm, was den selben fehler hat (winbar). ![]() |
Re: Ramauslastung (bei ramgrößen >2gb)
hmmm, ich dachte GlobalMemoryStatus ließt den Status komplett aus, da sollte es doch keinen Unterschied machen :gruebel:
Zitat:
![]() |
Re: Ramauslastung (bei ramgrößen >2gb)
wie setz ich dieses GlobalMemoryStatusEx in delphi um?
weil den befehl selbst scheint es nicht zu kennen und den variablentypen memorystatusEx genauso wenig! |
Re: Ramauslastung (bei ramgrößen >2gb)
Kommt auf deine Delphi-Version an, ob die die Deklaration kennt. Lade die die Win32API-Deklaration von den JEDIs runter, da sollte alles drin sein.
|
Re: Ramauslastung (bei ramgrößen >2gb)
Liste der Anhänge anzeigen (Anzahl: 1)
Such mal dadrin ... irgendwo stehts :roll:
|
Re: Ramauslastung (bei ramgrößen >2gb)
was mich grad verwundert.
ich hab das mit dem flag {$SetPEFlags $20} gemacht. damit funktioniert das auch einwandfrei. aber scheinbar wird das nur sporadisch verarbeitet - kann das sein? mal zeigt er mir mehr als 2gb ram an mal nicht. (nutze das BDS 2006) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 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 by Thomas Breitkreuz