2010-02-03 17 views
6

Mi entorno es XP de 32 bits. Encuentro que cuando la memoria asignada es casi del tamaño máximo, 2GB, eso significa que hay un poco de espacio virtual disponible, la memoria de asignación de recursos es muy lenta.Cuál es más rápido, leyendo desde el disco o asignando la memoria del sistema

Así que si tengo un archivo de página, mi aplicación debe analizarlos. Tengo dos formas. Una es leerlos todos en la memoria del sistema, luego hacer el análisis. La otra es reservar un búfer de memoria primero como un caché, y leer parte del archivo de página en ese búfer, analizar y luego descartarlo, luego leer la segunda parte del archivo de página y anular el caché, hacer el análisis de nuevo.

Desde el perfil, parece que el segundo es más rápido, ya que evita el costo del tiempo de asignación.

¿Qué opinas? Gracias en adavance.

+1

+1 para perfilar! – Justin

Respuesta

5

(1) No estoy seguro de que la pregunta coincida con el título. Si está asignando cerca de 2 GB de RAM en Windows de 32 bits, el sistema probablemente esté paginando una gran cantidad de memoria en el disco, y ahí es donde primero buscaría la ralentización. Cuando está usando mucha memoria, debería pensar que es almacenada en el disco (en pagefile.sys) pero en caché en RAM física. El segundo podría ser más rápido no por el costo de la asignación, sino por el costo de usar mucha memoria a la vez. En efecto, cuando copie el archivo en una asignación grande, estará copiando gran parte del disco-> disco a través de la RAM, y cuando lo vuelva a analizar para volver a analizarlo, estará cargando la copia nuevamente en la RAM. Si su análisis es un algoritmo de pase único, eso significa mucho trabajo redundante.

(2) Lo que creo que es, mmap el archivo (MapViewOfFile y amigos en Windows).

Editar: (3) a caution. Si el archivo es actualmente de 1,8 GB, es posible que el próximo año sea de 4 GB. Si es así, ahora planearía que tuviera un tamaño superior a 2^32 en una máquina de 32 bits, lo que significa tomar su segunda opción, o bien seguir usando MapViewOfFile pero haciéndolo en una sola porción del archivo de tamaño razonable. tiempo, en lugar de todo a la vez. De lo contrario, volverás a visitar este código la primera vez que alguien lo intente en un archivo grande e informe el error.

+0

Gracias. Es interesante. Pero tengo 4 GB de ram. Desde el administrador de tareas, la memoria RAM física disponible es de 1,6 GB gratis. ¿Esto todavía significa que se colocarán muchos búferes en el archivo de página sys cuando la asignación sea cercana a 2GB? – Buzz

+0

La asignación del búfer puede fallar mucho antes de que se agote la RAM. La pregunta es si está ejecutando Windows de 64 bits. Eso le permite usar> 2GB _RAM por proceso_. – MSalters

+1

@MSalters: el interlocutor no está ejecutando Windows de 64 bits. @ Buzz: pensarías que Windows no golpearía el intercambio (para programas no inactivos) antes de que toda la RAM esté en uso, pero nunca parece funcionar de esa manera. Es posible que en su caso no haya intercambio, pero si intentara explicar por completo la diferencia de rendimiento entre sus dos opciones, me gustaría descartarla: como control más simple, asegúrese de que el uso del archivo de página no aumente mientras su programa se está ejecutando. El siguiente paso sería observar las fallas de la memoria caché de la CPU. Pero como digo, mapearía el archivo, y si es más rápido, ¿a quién le importan los demás? ;-) –

5

Olvidas manera 3d - para asignar memoria en el archivo, consulte la función CreateFileMapping/MapViewOfFile Esta es la manera más rápida

+0

Es al revés. El archivo está mapeado en el espacio de direcciones del proceso. – Void

0

¿Por qué es la cantidad de memoria tan alto asignado? Si las asignaciones de memoria toman una cantidad de tiempo razonable, entonces encontrarás que hacerlo en la memoria es mucho más rápido. Mi enfoque sería hacerlo en la memoria, y tratar de encontrar una forma de reducir el uso de la memoria al punto en que vuelva a ser rápido. .

1

Lo mejor es utilizar Windows MapViewOfFile y funciones similares (el equivalente de Windows de mmap). Esto permitirá que el sistema operativo administre la búsqueda de varias partes del archivo.

+0

Pero si tengo varios archivos de página grandes (1.8GB), ¿está bien? – Buzz

+0

El sistema operativo mapeará el archivo completo en la memoria de su proceso, pero solo cargará en RAM los bits del archivo que está mirando.Esta es exactamente la forma en que el SO gestiona su espacio de intercambio de disco. – doron

+2

@ Buzz: no puede asignar todos los archivos de 1.8 GB al mismo proceso de 32 bits al mismo tiempo, porque el espacio virtual debe asignarse aunque la memoria física solo se haya asignado según sea necesario. Diferentes archivos en diferentes procesos deberían estar bien, hasta donde yo sé, y siempre puedes mapear el archivo en fragmentos (de la misma manera que tu segunda opción lee fragmentos, pero mapea trozos más grandes). –

0

Cuando veo la situación, puede administrar el paginado usted mismo o dejar que el sistema operativo administre el paginación para usted. En la mayoría de los casos, sugeriría dejar que el sistema operativo maneje la paginación (use la memoria virtual). Como desconfío de los sistemas operativos MS, no puedo recomendar esta técnica, aunque su kilometraje puede variar.

Cuestiones relacionadas