Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   como llenar la memoria Ram (https://www.clubdelphi.com/foros/showthread.php?t=59688)

kurono 04-09-2008 16:32:25

como llenar la memoria Ram
 
hola amigos me disculpan por poner este hilo ya que habia creado uno parecido pero es que todavia no e podido hacer la idea que tengo espero que esta ves pueda explique bien .

lo que quiero hacer es un programa que me llene cierta cantidad de MB de la memoria ram y luego me la descargue ¿para que esto ? . pues bien una ves realizada esta operacion de llenado y descarga pueda medir el tiempo en que hiso esa operacion asi pueda medir la velocidad de la memoria en segundo o minuto .se bien que diran que la memoria no se mide de esa forma pero es esta la forma en la que quiero medirla pues esa es la manera en que se traduce la velocidad de un componente para el usuario y hasta para mi . porque eso es lo que uno espera de un computardor que realize una operacion en x tiempo no en xMb/s,Mips,Cpi ect. me entienden

luisgutierrezb 04-09-2008 21:05:40

pues suena bien, pero que pasa cuando llenes una de 128 mb y otra de 1 gb se va a tardar mas la de 1 gb y no por eso es mas lenta, yo diria que llenaras un multiplo comun por ejemplo 1 mb y de ahi ya saques tu velocidad, ademas para obtener la velocidad asi dependen otras cosas, como los programas en ejecucion, etc...

kurono 04-09-2008 23:29:41

como bien dices utilizare un multiplo comun para los standeres de las memorias actualmente como el ejemplo que pusiste de 1mb o hasta 10mb puede ser para que esa operacion no se interrumpa como dices por algun programa en ejecucion o proceso pienso poner un aviso al momento de ejecutarlo diciendo que se debe cerrar toda aplicacion habierta

Crandel 05-09-2008 09:45:58

Aunque lo que propones es interesante, recuerda que dos maquinas exactamente iguales en Hardware no responderan igual en velocidad de aceso a la ram, debido a que se debe tambien al uso actual de memoria.

Y en la misma maquina, no es lo mismo llenar una memoria con 10 vectores de 1mb que con un vector de 10 mb. Y si sigues llenando la memoria sin liberarla, en un momento empezará a tardar mucho mas.

kurono 05-09-2008 19:26:03

se bien que un componente tales como memoria procesador no funciona igual en en diferente maquina y ahi esta unos de los motivo para hacer este programa y ver el funcionamiento de una memoria en diferente maquina . en cuanto a las cantidad de memoria pues pienso ponerle varias opciones de diferente tamaño y a final de cada prueba liberar la memoria

cHackAll 05-09-2008 20:49:16

Luego de haber seguido el anterior hilo y éste, repito lo que ya dije:

Cita:

Empezado por cHackAll (Mensaje 310042)
Para acceder a la memoria RAM necesitas modificar los privilegios de acceso a dicho objeto (restringido por su naturaleza crítica), luego realizar un mapeado del mismo en tu proceso y leer por bloques razonables múltiplos de 4 Kb que es el tamaño del PAGE_SIZE en arquitecturas x86...

Y recalco que es MUY peligroso escribir en la memoria RAM puesto que allí recide el núcleo del SO, los Drivers y muchos otros componentes del SO que al ser modificados provocarían las peores excepciones y la perdida de datos.

Código Delphi [-]
uses Windows, SysUtils;
 
const Section: array [0..7] of PWideChar = (Ptr(24), nil, @Section[6], Ptr(64), nil, nil, Ptr(3014700), '\Device\PhysicalMemory');
function NtOpenSection(var Handle: Cardinal; Access: Cardinal; const Section): Cardinal; stdcall; external 'ntdll';
 
var
 Handle, Time, Size, Offset: Cardinal;
 MemoryStatus: TMemoryStatus;
 lpBuffer: PChar;
 
begin
 if NtOpenSection(Handle, 4, Section) = 0 then
  begin
   GlobalMemoryStatus(MemoryStatus);
   Size := MemoryStatus.dwTotalPhys;
   Offset := 0;
   Time := GetTickCount;
   repeat lpBuffer := MapViewOfFile(Handle, 4, 0, Offset, $1000);
    if Assigned(lpBuffer) then
     UnmapViewOfFile(lpBuffer);
    Inc(Offset, $1000);
   until Offset = Size;
   Time := GetTickCount - Time;
   CloseHandle(Handle);
   MessageBox(0, PChar(IntToStr(Time div 1000)+'.'+IntToStr(Time mod 1000)), nil, 0);
  end;
end.

El anterior ejemplo hace lo que comentaba en mi post citado, pero te aconsejo utilizar la API LocalAlloc para emular lo que necesitas, caso contrario no dejes de considerar lo comentado por HySTD en el anterior hilo.

Saludos

kurono 07-09-2008 07:10:30

puedes darme un ejemplo de la API LocalAlloc pues no quiero dañar la memoria ram

cHackAll 08-09-2008 02:45:53

Cita:

Empezado por kurono (Mensaje 312283)
puedes darme un ejemplo de la API LocalAlloc pues no quiero dañar la memoria ram

He editado mi post pues no quise decir lo que habia dicho :o, el ejemplo que ya tienes funciona para "medir" la lectura sin daños en la RAM, y el resultado de escritura no sería muy distinto asi que en cualquier caso puedes simular el proceso.

Aquí hay un ejemplo para reservar y mapear paginas de memoria física, ésto es un paso adicional necesario que tambien deberia ser cronometrado.

PD: VirtualAlloc es básicamente lo mismo que GetMem con la diferencia que puedes controlar de mejor manera la memoria "agotada".

Saludos

kurono 08-09-2008 03:39:05

ok muchas gracias lo probare solo una duda el ejemplo que pusiste habia dicho que es para la arquitectura de x86 que parametro se cambiaria para la arquictectutra de 64bit

cHackAll 08-09-2008 21:23:11

El problema es la cantidad de bits utilizados para direccionar cada página y el tamaño de dicha unidad mínima en si (PAGE_SIZE).

Cita:

Empezado por http://msdn.microsoft.com/en-us/library/aa366528(VS.85).aspx
64-bit[/url] Windows on Itanium-based systems: Due to the difference in page sizes, AllocateUserPhysicalPages is not supported for 32-bit applications.

El ejemplo que te dí es la Address Windowing Extensions, en sistemas basados en arquitectecturas de 64 bits creo que se llama Large Address Aware, acá algo de documentación.

PD; tambien revisa la Physical Address Extension

Saludos

Cheerpipe 09-09-2008 22:20:13

Creo que una buena alternativa para esto, podria ser crear una lista enlazada manualmente reservando memoria con LocalAlloc, una lista enorme, muy muy grande, luego aplicas el comando:

SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);

con eso disminulles en algo la fragmentacion de la lista.

La lista pude contener como modulo de datos na variable de widestring para acumular mas memoria.

Luego la llenas y tomas el tiempo de lo que tardaste. Asi usas poco procesador y el tiempo sera el que tomara el PC en escribir los bytes correspondientes. Claro que esta es una forma muuuy arcaica de probar la velocidad. lo ideal seria reservar una cantidad compacta de unos cientos de megas, y escribir manualmente en ella. No se si en delphi se puede hacer eso, con C/C++ si puedes. Ademas hay distintos tipos de accesos a memoria, ahi tendrias que usar incluso ensamblador para probar accesos directos, indexados, y como eel disco duro, accesos secuenciales y aleatorios.

kurono 10-09-2008 03:31:51

ok probare los distintos algoritmo que me mensionan a ver cual me va mejor


La franja horaria es GMT +2. Ahora son las 10:53:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi