2011-01-13 13 views
10

Me preguntaba si era posible evitar que la memoria de un objeto (clase o estructura) se intercambiara en el disco?¿Puedes evitar que la memoria se canse en el disco?

Editar: En cuanto a por qué me han dicho que algunos de los datos con los que voy a trabajar no se pueden escribir en el disco.
No espero que se deje lo suficiente como para que los datos se intercambien, pero pensé que valía la pena comprobarlo.

+4

¿Por qué quieres evitar esto? =) – Jens

+2

¿Quiere decir además de usarlo? Por lo general, preocuparse por ese tipo de cosas queda en manos del sistema operativo. Simplemente al usarlo, reduce la posibilidad de que se lo coloque en su espacio de intercambio. Si no lo ha usado recientemente, es posible colocarlo en el disco. ¿Ves objetos que se usan con frecuencia en el disco? – Crisfole

+2

Huelo una micro optimización. ¿Cómo sabes que esto es un problema para ti? –

Respuesta

4

Quizás esté buscando SecureString class, que no se intercambiará en el disco.

+0

Dudo que sea lo que busca el asker, pero gracias por el enlace :) –

+3

¿Hay alguna referencia disponible que pruebe que SecureString no se intercambia? Veo que se puede convertir en GC, no se agrupa y está implícitamente encriptado. Si SecureString no se intercambia, su implementación puede dar una pista. – atamanroman

+1

Esto no es exacto. SecureString existe especialmente para evitar ver la cadena de nuevo en el archivo de paginación. –

0

No realmente, eso es algo del sistema operativo.

Simplemente tenga la seguridad de que la estrategia de paginación de Windows priorizará mantener en memoria las páginas a las que se accede con mayor frecuencia, por lo que si una página determinada es importante para su aplicación, estará allí tanto como sea posible.

0

Um, buena pregunta ... puede deshabilitar el intercambio en Windows por completo (tamaño = 0), pero idk si eso es suficiente para evitar el intercambio de .NET.

+0

inseguro parece que esta podría ser la única forma :( – Dreaddan

3

Esto solo es técnicamente posible. Las páginas de memoria se pueden bloquear en la RAM con la función API de VirtualLock(). El problema es que eso requiere el suministro de la dirección de la (s) página (s) que desea bloquear. No puede obtener esta dirección de ninguna manera documentada del recolector de basura. Tampoco promete que la misma dirección para, digamos, el gen # 0 montón será repetible. Por un lado, el tamaño de ese montón es dinámico, por lo general oscila entre 2 y 8 megabytes, dependiendo del patrón de asignación del programa.

Simplemente bloquear aleatoriamente un rango grande con la esperanza de que atrape la mayoría de ellos tampoco funciona. Un proceso obtiene una cuota de páginas bloqueables. No es muy grande, sobre todo porque es tan desestabilizador para el funcionamiento de la máquina. Dragones viven aquí.

+0

Usted habría pensado que ms habría proporcionado un .net equiv de VirtualLock. – Dreaddan

8

Todavía no tengo claro por qué quieres hacer esto. En el contexto de C#, debe hacer dos cosas: "fijar" la memoria para que no pueda ser reubicada por la recolección de basura, y luego bloquearla para que no se cancele.

Aquí es un blog agradable que describe cómo hacer la primera parte (fijar):

http://www.matthew-long.com/2005/10/18/memory-pinning/

Ahora se necesita la dirección y el alcance del objeto de poder invocar VirtualLock:

http://msdn.microsoft.com/en-us/library/Aa366895

Tenga en cuenta que sólo se bloquea páginas VirtualLock (unidades de 4K), por lo que su área de memoria tiene que ser al menos tan grande, y alineado con el inicio de una página . Supongo que debe invocarse en un contexto unsafe, aunque no estoy seguro.

Publicaciones previas sobre el tema: Prevent an object from being paged out (VirtualLock equivalent)

Otra entrada de blog relacionada: http://geekswithblogs.net/robp/archive/2008/08/13/speedy-c-part-3-understanding-memory-references-pinned-objects-and.aspx

4

me gustaría hacer algo totalmente diferente:

Construir un buen nativa envoltura C++ DLL con su funciones/asignaciones deseadas/lo que sea que también se asegurará de que los datos no se intercambien (VirtualLock como alguien dijo aquí). Úselo desde C#.

Después de todo, de forma nativa es posible, es solo que ahora estás obligado a C#. Entonces, ¡hazlo!

0

Dependiendo de su entorno, también puede hacer esto en el nivel del sistema operativo en su lugar: simplemente use una máquina muy robusta con mucha RAM y deshabilite la paginación/intercambio por completo. Significa que es mejor que nunca desbordes esa memoria RAM, pero ahí es donde vuelve la tarea a C#: puedes limitar el uso máximo de la memoria con un diseño inteligente.

https://www.howtogeek.com/126430/htg-explains-what-is-the-windows-page-file-and-should-you-disable-it/

Cuestiones relacionadas