Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Verhinden des Memory ausgelagert wird (https://www.delphipraxis.net/103173-verhinden-des-memory-ausgelagert-wird.html)

gsh 11. Nov 2007 19:23


Verhinden des Memory ausgelagert wird
 
Hi Leute

Wie kann ich verhindern des der Speicher den ich reserviere in die Auslagerungsdatei geschrieben wird.

Also wenn ich GetMem(1) mache dann will ich das dieses Byte direkt im Memory steht also nicht in die auslagerungsdatei geschreiben wird. Damit ich schnell auf diese Daten zugreifen kann. Geht des oder verhindert des Windows?

grenzgaenger 11. Nov 2007 19:31

Re: Verhinden des Memory ausgelagert wird
 
weshalb willste denn das? schnell auf 'ne variable zugreifen, wenn du nicht drauf zugreifst ... :gruebel: :gruebel: :gruebel: :gruebel:

xaromz 11. Nov 2007 19:52

Re: Verhinden des Memory ausgelagert wird
 
Hallo,

http://blogs.msdn.com/oldnewthing/ar...6/5924058.aspx. In den Kommentaren steht einiges drin. Aber der eigentliche Artikel ist wohl auch interessant.

Gruß
xaromz

Uwe.F. 11. Nov 2007 20:37

Re: Verhinden des Memory ausgelagert wird
 
Hallo,

ich allociere und fixe meinen Speicher so:

H:=GlobalAlloc(GMEM_FIXED, Bytes+2);
if H=0 then MemoryOverFlow;
P:=GlobalLock(H);

Damit müsste das Auslagern auch disabled sein.

Hope it helps.

Beste Grüße,
Uwe

gsh 11. Nov 2007 20:45

Re: Verhinden des Memory ausgelagert wird
 
Zitat:

Zitat von Uwe.F.
H:=GlobalAlloc(GMEM_FIXED, Bytes+2);
if H=0 then MemoryOverFlow;
P:=GlobalLock(H);

ah ja des schaut ganz gut aus.
kann ich auch irgendwie feststellen ob des dann auch wirklich im ram liegt? (also so zum testen ob des in meiner app funkt)

edit: aja und warum eigentlich Bytes+2?

Dax 11. Nov 2007 20:48

Re: Verhinden des Memory ausgelagert wird
 
If you really want to lock memory, you can grant your process the SeLockMemoryPrivilege privilege and use the AWE functions to allocate non-pageable memory.
Das lese ich als: "Entweder AWE oder garnicht!"

gsh 11. Nov 2007 20:50

Re: Verhinden des Memory ausgelagert wird
 
was ist AWE?

Dax 11. Nov 2007 20:56

Re: Verhinden des Memory ausgelagert wird
 
Managing AWE memory

Wichtig ist jedoch, dass dies scheinbar die einzige Möglichkeit ist.

gsh 11. Nov 2007 21:11

Re: Verhinden des Memory ausgelagert wird
 
so hab des mal am besten mit taskmanager getestet und bei der obrigen methode scheint es nicht zu funzen.

@Dax: geht es da nicht um den M$ SQL Server? und wie man des bei dem einstellt

Dax 11. Nov 2007 21:15

Re: Verhinden des Memory ausgelagert wird
 
Huch, Tatsache... Hab den Link oben korrigiert.

gsh 11. Nov 2007 21:31

Re: Verhinden des Memory ausgelagert wird
 
ja des schaut schon besser aus aber:
Zitat:

Address Windowing Extensions (AWE) is a set of extensions that allows an application to quickly manipulate physical memory greater than 4GB. Certain data-intensive applications, such as database management systems and scientific and engineering software, need access to very large caches of data. In the case of very large data sets, restricting the cache to fit within an application's 2GB of user address space is a severe restriction. In these situations, the cache is too small to properly support the application.
der erste absatz sagt mir eigtlich schon des dieses AWE system eigentlich nur dafür da ist die 2GB grenze bei XP zu umgehen

Uwe.F. 11. Nov 2007 21:34

Re: Verhinden des Memory ausgelagert wird
 
Zitat:

Zitat von gsh
kann ich auch irgendwie feststellen ob des dann auch wirklich im ram liegt? (also so zum testen ob des in meiner app funkt)

Getestet habe ich es nie. Ich musste Audiodaten von einer Karte holen. Wenn diese ausgelagert gewesen wären, hätte ich sicherlich Aussetzer gehabt. Hatte ich aber nie.

Zitat:

Zitat von gsh
edit: aja und warum eigentlich Bytes+2?

Historische Gründe - kannst Du weglassen.

Beste Grüße,
Uwe

gsh 11. Nov 2007 21:36

Re: Verhinden des Memory ausgelagert wird
 
Zitat:

Zitat von Uwe.F.
Getestet habe ich es nie. Ich musste Audiodaten von einer Karte holen. Wenn diese ausgelagert gewesen wären, hätte ich sicherlich Aussetzer gehabt. Hatte ich aber nie.

naja nur weil es funktioniert heißt nicht des es immer funkt. es kann ja sein des diese funktion manchmal den memory in den ram ablegt manchmal aber auch in der auslagerungsdatei

Dax 11. Nov 2007 21:42

Re: Verhinden des Memory ausgelagert wird
 
Mit GlobalAlloc/VirtualLock kannst du dem Speichermanager lediglich Tips geben, ob ein bestimmter Speicherbereich während der Ausführungszeit des Programms nicht ausgelagert werden darf, nicht hingegen, dass dieser Speicher immer im Ram zu halten ist. Das kannst du nur umgehen, indem du direkt in den Paging-Prozess von Windows eingreifst - mittels der AWE-Funktionen - und so direkt verhinderst, dass ein Bereich des physischen Speichers bis auf weiteres für überhaupt irgendwas anderes benutzt werden kann.

Das steht aber auch so in dem vom xaromz verlinkten Artikel ;)

gsh 11. Nov 2007 21:47

Re: Verhinden des Memory ausgelagert wird
 
Zitat:

Zitat von Dax
Mit GlobalAlloc/VirtualLock kannst du dem Speichermanager lediglich Tips geben, ob ein bestimmter Speicherbereich während der Ausführungszeit des Programms nicht ausgelagert werden darf, nicht hingegen, dass dieser Speicher immer im Ram zu halten ist. Das kannst du nur umgehen, indem du direkt in den Paging-Prozess von Windows eingreifst - mittels der AWE-Funktionen - und so direkt verhinderst, dass ein Bereich des physischen Speichers bis auf weiteres für überhaupt irgendwas anderes benutzt werden kann.

Das steht aber auch so in dem vom xaromz verlinkten Artikel ;)

hmmm ja ok

und wie stell ich des am besten mit der AWE-Funktion an?

//Edit: hab des jetzt mal so getest
Delphi-Quellcode:
VirtualAlloc(P, 100*1024*1024, MEM_RESERVE or MEM_PHYSICAL, 0);
aber des scheint nicht zu funktionieren (Laut Task-Manager)

Uwe.F. 11. Nov 2007 22:10

Re: Verhinden des Memory ausgelagert wird
 
Habe noch mal in die W32-Hilfe gesehen:

The GlobalLock function locks a global memory object and returns a pointer to the first byte of the object's memory block. The memory block associated with a locked memory object cannot be moved or discarded.

Wenn der Memoryblock nicht verschoben werden kann, wird er meines Erachtens auch nicht ausgelagert.
Meine Applikation funktioniert jedenfalls seit 10 Jahren ohne Ausfall (unter der Annahme, dass ausgelagerter Speicher nicht innerhalb 20 Millesekunden nachgeladen ist).

Beste Grüße,
Uwe

Luckie 11. Nov 2007 22:21

Re: Verhinden des Memory ausgelagert wird
 
Warum darf der Speicherbereich denn nicht ausgelagert werden? Mir ist bisher noch keine Situation untergekommen, wo das schlecht gewesen wäre.

himitsu 12. Nov 2007 01:57

Re: Verhinden des Memory ausgelagert wird
 
Zitat:

Zitat von Uwe.F.
Wenn der Memoryblock nicht verschoben werden kann, wird er meines Erachtens auch nicht ausgelagert.

nicht korrekt, es kann nur im virtuellen Speicherraum der Anwenung weder verschoben noch freigegeben werden,
aber ausgelagert kann er dennoch werden.


Zitat:

Zitat von gsh
//Edit: hab des jetzt mal so getest
Delphi-Quellcode:
VirtualAlloc(P, 100*1024*1024, MEM_RESERVE or MEM_PHYSICAL, 0);
aber des scheint nicht zu funktionieren (Laut Task-Manager)

hast du dir mal im MSDN die Texte zu Managing AWE Memory durchgelesen?

damit reservierst du nur 'ne Stelle im Virtuellen Speicherraum der Anwendung
den physischen Speicher mußt du extra resevieren und dann auch noch an dieser Stelle einblenden.

gsh 12. Nov 2007 12:26

Re: Verhinden des Memory ausgelagert wird
 
Zitat:

Zitat von himitsu
hast du dir mal im MSDN die Texte zu Managing AWE Memory durchgelesen?

damit reservierst du nur 'ne Stelle im Virtuellen Speicherraum der Anwendung
den physischen Speicher mußt du extra resevieren und dann auch noch an dieser Stelle einblenden.

ja ich hab zumindest versucht alles zu verstehen aber mein englisch ist nicht soooo gut :oops:


versteh ich nicht ... gebe ich nicht mit MEM_PHYSICAL an des ich pysikalischen Speicher haben will :gruebel:

gsh 14. Nov 2007 18:12

Re: Verhinden des Memory ausgelagert wird
 
:duck:

Uwe.F. 14. Nov 2007 19:10

Re: Verhinden des Memory ausgelagert wird
 
Und ... was bedeutet

http://www.delphipraxis.net/images/smiles/duck.gif

das?

gsh 14. Nov 2007 19:19

Re: Verhinden des Memory ausgelagert wird
 
Das war ein push von mir

himitsu 19. Nov 2007 08:28

Re: Verhinden des Memory ausgelagert wird
 
also, ich hab mir mal den Democode aus'm PSDK nach Delphi übersetzt
(mein Englisch ist übrigens auch sehr bescheiden :oops: )
und es funktioniert wunderbar (jedenfalls wenn man noch eine "normale" Speicherresservierung als Reserve mit einbaut),
aaaaber dieses ist in einem normalem Programm sogut wie unnütz,
denn wie im MSDN/PSDK steht, muß dieses auch noch im Windows aktivert sein
und ich denk mal bei 99% der PCs ist dieses nicht der Fall.

Zitat:

An application must have the Lock Pages in Memory privilege to use AWE.
gut, die kann sich das Programm "leicht" besorgen,
Zitat:

To obtain this privilege, an administrator must add Lock Pages in Memory to the user's User Rights Assignments.
aber hier wird es schwerer...


allerding weiß ich jetzt nicht obWindows den speicher nicht doch auslagern kann
und vorallem was passiert beim Ruhezustand/Hypernate, weil da muß windows doch auslagern, oder es geht was nicht :?

hathor 19. Nov 2007 09:11

Re: Verhinden des Memory ausgelagert wird
 
Es gibt auch noch die Möglichkeit, eine RAMDISK einzurichten.(MS-RAMDRIVE)
Maximale Grösse: 32 MB.

A ramdisk can perfectly be used to store :

- web content of web servers.
- temporary index files and tables of database servers ( MS-SQL-Server , MySQL , ...).
- temporary files ( TEMP and TMP environment variable ) and "Temporary Internet Files".
- the scratch disk for Adobe (R) Photoshop (R).
- games and installed programs (1). The startup times of programs may decrease drastically !
- audio and video capture / editing.
- creation and playback of slide shows.
- data that has to be written to CD , to prevent underrun during the burn process.
- as storage of the "ReadyBoost" cache on Vista.
- all kinds of data that may be lost ( or MUST be lost for security reasons ) at shutdown.

http://support.microsoft.com/kb/834886/de
http://www.winfaq.de/faq_html/Conten...?h=tip1260.htm

http://www.ramdisk.tk/
RAMDisk , depending on the RAM memory size that the OS supports , to up to 64 GB.

gsh 19. Nov 2007 16:03

Re: Verhinden des Memory ausgelagert wird
 
ah danke des mit der Ramdisk werd ich mir mal anschauen

himitsu 21. Nov 2007 12:19

Re: Verhinden des Memory ausgelagert wird
 
Zitat:

Zitat von gsh
der erste absatz sagt mir eigtlich schon des dieses AWE system eigentlich nur dafür da ist die 2GB grenze bei XP zu umgehen

Ja, es ist unter anderem dafür entwickelt worden, aber man kann es auch für Angelegenheiten wie diese hier nutzen.

Aber mal eine Frage, wofür genau benötigst du dieses? (für was und vorallem wieviel)

gsh 21. Nov 2007 17:29

Re: Verhinden des Memory ausgelagert wird
 
Zitat:

Zitat von gsh
ah danke des mit der Ramdisk werd ich mir mal anschauen

also ich hab mir des mal angeschaut ist ganz cool die ramdisk aber für mich total ungeignet da ich keinen eigenen Treiber mitführen möchte (Programm sollte von USB-Stick startbar sein)


Zitat:

Zitat von himitsu
Ja, es ist unter anderem dafür entwickelt worden, aber man kann es auch für Angelegenheiten wie diese hier nutzen.
Aber mal eine Frage, wofür genau benötigst du dieses? (für was und vorallem wieviel)

Naja es soll halt ein schneller Pufferspeicher sein der dann auf die Festplatte geschreiben wird und wenn der Buffer ausgelagert wird dann muss die festplatte 3 mal so viel arbeiten als wenn er vom ram kopiert wird.

Nicht viel ... 5 MB vllt. des muss ich erst testen was am besten ist

himitsu 21. Nov 2007 18:40

Re: Verhinden des Memory ausgelagert wird
 
Zitat:

Zitat von gsh
Naja es soll halt ein schneller Pufferspeicher sein der dann auf die Festplatte geschreiben wird und wenn der Buffer ausgelagert wird dann muss die festplatte 3 mal so viel arbeiten als wenn er vom ram kopiert wird.

Normal ist gut ... was für Daten sind es denn nun, die sooo wichtig sind, daß sie nichtmal einen Buchteil einer (Milli)Sekunde warten können.

Das Problem ist halt, daß erstmal nicht jeder gleich damit arbeitet (drum hab ich auch den den übersetzten Code nicht gepostet)
Stell dir mal vor jeder fängt plötzlich damit an ... und ganz schnell wäre Windows am Abstürzen, weil ihm der Speicher ausgeht.
dieser Rechner hier hat z.B. keine Auslagerungsdatei (wegen Problemen mit einer zulangsamen Festplatte) und nur 500 MB RAM, also alles nur physischen Speicher und du kannst mir glauben, ich hab schon oft erlebt wie hier alles am verreckn ist, wenn der freie RAM ausgeht

schneller Puffer: wenn du oft genug und/oder mit nicht all zu großen Pausen auf deinen Speicher zugreifst, dann lagert den Windows auch (wenn möglich) nicht aus (dieser bleibt also auch ohne das zu tun im RAM).

Und was das AWE betrifft: wie gesagt, dieses muß erst vom Admin im Windows aktiviert werden (standardmäßig ist es auf allen Windowssystemen abgeschaltet)
heißt: im Gruppenmanager das häckchen setzen, Rechner neu starten und erst dann haben Programme die Möglichkeit dieses zu nutzen.

gsh 21. Nov 2007 19:07

Re: Verhinden des Memory ausgelagert wird
 
Naja ich werds doch so lassen und darauf hoffen des windows es im speicher lässt.

Jaja und des Prob ist nicht die Zeit sondern:

Wenn der Buffer ausgelagert wird
Daten -> Buffer (wird auf festplatte ausgelagert) =
schreibzugriff auf festplatte um buffer auszulagern
Buffer -> Auf Festplatte kopieren (in die richtige datei)
lesezugriff um ausgelagerten buffer zu lesen
schreibzugriff um buffer in datei zu schreiben


Wenn der Buffer NICHT ausgelagert wird
Daten -> Buffer (steht im Speicher) =
buffer bleibt im ram
Buffer -> Auf Festplatte kopieren (in die richtige datei)
lesezugriff vom ram um buffer auszulesen (geht viel schneller da die fesplatte sowieso genug zu tun hat)
schreibzugriff auf festplatte um buffer in datei zu schreiben


Es geht darum bei großen und vielen Dateien die Festplatten performance besser zu nutzen

himitsu 21. Nov 2007 19:32

Re: Verhinden des Memory ausgelagert wird
 
Zitat:

Zitat von gsh
Es geht darum bei großen und vielen Dateien die Festplatten performance besser zu nutzen

genau dafür versuch ich es auch zu nutzen (Thema FileSplitter), allerdings wird da der Speicherblock nur "kurz" benötigt.
Außerdem prüfe ich vorher, ob es das System "zu sehr" beeinträchtigen könnte (genug freier physikalischer Speicher) und ich hab mir eine alternative virtuelle Ausweichvariante mit integriert.

und auch wenn der Code soweit funktioniert (Programm läuft einwandfrei) bin ich dennoch am Testen ob es nicht irgendwelche Nachteile für andere Programme gibt und wie ich die Grenzwerte am Besten festlege.

mein FileSpliter ist ja jetzt schon nicht grad nett zum PC und läßt die Platte glühen :oops:
abgesehn davon wird das AWE bei meinem Program eh sehr selten genutzt werden, da es schließlich fast immer deaktivert sein wird -.-''
(ich hab's eigentlich auch nur aus Spieltrieb eingebaut ... jedenfalls hätte ich mir im Normalfall nicht die Arbeit gemacht um erst rauszufinden wie es geht)


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