2011-12-23 7 views
8

Estoy planeando una aplicación que implicará cargar muchas imágenes a la vez y, por lo tanto, requiere una gran cantidad de memoria. Por ejemplo, podría tener 50 objetos de imagen creados a la vez, tomando un total de 1GB de RAM. Pero cuando el usuario va a cargar 20 imágenes más, me gustaría asegurarme de que la cantidad de memoria ya está reservada y lista.¿Cómo reservar memoria para mi aplicación y dejar una cantidad especificada restante?

Ahora esta parte puede parecer un poco al revés de lo normal. En lugar de especificar cuánta memoria se reservará mi aplicación, en su lugar debo especificar cuánta memoria dejar libre para otras aplicaciones, y ajustar la memoria de mi aplicación periódicamente de acuerdo con esta especificación. Debo decir que nunca he trabajado reservando memoria, y sobre todo no sabré cómo dejar esta memoria disponible restante.

Entonces, por ejemplo, si la computadora tiene 2048 MB de RAM, y la opción está configurada para dejar 50 MB gratis para otras aplicaciones, y ya hay otras 10 MB de RAM, entonces debería reservar 2048- 50-10 = 1988 MB para mi aplicación.

El problema que preveo es que el usuario abre otra aplicación que requiere 1GB. Mi aplicación tiene que atrapar esto y reducirse.

¿Esto suena como un enfoque factible? Básicamente, necesito asegurarme de que haya tanta memoria reservada como sea posible en un momento dado, dejando una cantidad decente disponible para otras aplicaciones. ¿Tendría un impacto significativo en el rendimiento si hago esto, o no mucho? Podría estar cargando y descargando imágenes a pasos rápidos, y no quiero que reserve/libere esta memoria a pedido, quiero que se mantenga reservada.

+5

+1 Esta es una buena pregunta y no tengo ni idea de por qué tiene votos hacia abajo. –

+1

@David. Estaba a punto de hacer la misma pregunta. Downvoters: por favor proporcione un razonamiento o podríamos pensar que es solo el trabajo de algunos monos que intentan reescribir Shakespeare ... –

+3

Este [artículo] (http://msdn.microsoft.com/en-us/library/aa175282%28v= sql.80% 29.aspx) es antiguo, pero explica cómo lo hace SQL Server 2000. Puede que le interese ... Solo tenga en cuenta que todas las aplicaciones que conozco que actúan de esta manera tienen opciones adicionales para ajustar el uso de la memoria. –

Respuesta

8

+1 para que Sertac mencione cómo SQL Server recorre la línea de asignación de memoria que necesita, pero liberando memoria cuando Windows se queja.

Las aplicaciones pueden recibir quejas de la ventana mediante el uso de la CreateMemoryResourceNotification:

hLowMemory := CreateMemoryResourceNotification(LowMemoryResourceNotification); 

Las aplicaciones pueden utilizar los eventos de notificación de recursos de memoria para escalar el uso de la memoria según corresponda. Si la memoria disponible es baja, la aplicación puede reducir su conjunto de trabajo. Si la memoria disponible es alta, , la aplicación puede asignar más memoria.

Cualquier hilo de la proceso que llama puede especificar el mango de notificación de recursos de memoria en una llamada a la función QueryMemoryResourceNotification o uno de los wait functions. El estado del objeto se señaliza cuando existe la condición de memoria especificada.Este es un evento de todo el sistema, por lo que todas las aplicaciones reciben una notificación cuando se señala el objeto. Nota que hay una gama de disponibilidad de memoria que ni el LowMemoryResourceNotification o HighMemoryResourceNotification objeto se señala. En este caso, las aplicaciones deben intentar mantener constante el uso de la memoria .

Pero también vale la pena mencionar que también podría asignar la memoria que necesita. Su sistema operativo tiene un conjunto muy sofisticado de algoritmos para intercambiar la memoria menos utilizada cuando la presión de la memoria es alta. Puede aprovechar esto simplemente asignando toda la memoria que necesita. Cuando Windows empiece a agotarse, encontrará las páginas de memoria que menos usa y las intercambiará en el disco. (This is how a well-known reverse proxy works).

Lo único que queda por decidir es si desea liberar algunas imágenes cuando Windows dice que se está quedando sin memoria RAM. Pero si no está usando la memoria, se la cambiará al disco por usted.

+0

+1 y aceptado: D Tengo la intención de tratar las quejas de Windows al detener la reproducción de ciertos gráficos, o al disminuir la resolución de cómo se representa. Tengo capas sobre capas de imágenes para combinar en una imagen maestra (presentada como un SO). Básicamente tengo una simulación de "Escritorio" con ventanas dibujadas personalizadas, etc. y manejo de pintura, etc. Al igual que Windows maneja los comandos de pintura a través de 'Invalidar;' –

+0

Y gracias por el presente de Navidad Ian, Sertac y David: P –

+0

Alguien más intenté esto para ver si realmente funciona? Cuando intenté usar QueryMemoryResourceNotification y nunca recibo una notificación, incluso cuando los procesos se cuelgan debido a la espera de asignar memoria. –

7

No es realista dar cuenta de otras aplicaciones. Sólo ingoralos. El sistema abrirá y cerrará las páginas según sea necesario. Si realmente quisiera hacer esto, tendría que adaptarse dinámicamente a otros procesos a medida que comienzan y terminan. Eso realmente no es realista. Además, no es práctico preguntar a otros procesos cuánta memoria necesitan. Déjalo todo en el sistema.

Establezca un presupuesto para su aplicación y asegúrese de no excederlo. Mantenga las imágenes usadas más recientemente en la memoria y cuando se acerque al presupuesto de su memoria, deseche las imágenes usadas menos recientemente para dejar espacio.

Si está destacando los recursos disponibles, asegúrese de utilizar FastMM y habilite LARGE_ADDRESS_AWARE para su aplicación, de modo que obtenga espacio de direcciones de 4 GB cuando se ejecute en un sistema operativo de 64 bits.

+0

+1 Gracias, eso tiene sentido. Lamento decir que todavía * todavía no he probado FastMM, pero tengo pensado hacerlo muy pronto. Entiendo que es prácticamente esencial para Delphi 7. –

+0

Sí. Es asunto de OS aquí. Todo lo que puedes hacer es evitar ser codicioso/descuidado con la memoria. –

+4

¡No solo lo necesita para LARGE_ADDRESS_AWARE, sino que incluso puede encontrar el acceso al puntero colgando! ;-) –

Cuestiones relacionadas