Cualquier pregunta de un PROFI a un SUPER PROFI - 1. - página 27

 
sergeev:

Esta pregunta se refiere al trabajo con el mapeo de la memoria.

¿Es posible cambiar dinámicamente el tamaño de la memoria asignada (CreateFileMapping) y su proyección (MapViewOfFile) sin recurrir a copiar y recrear?

Es decir, la cuestión es ésta:

Se crea un objeto CreateFileMapping en memoria para intercambiar datos entre procesos (escritor-lector) de 100 bytes. y MapViewOfFile del mismo tamaño de 100 bytes.

El primer proceso de escritura puede escribir todos los 100 bytes de datos en la memoria que el segundo proceso de lectura no consigue limpiar.

Así que el reto es, ¿hay alguna manera de ampliar el tamaño de la memoria asignada sin volver a crear CreateFileMapping / MapViewOfFile de nuevo?
Así, el primer proceso no esperaría a la liberación, sino que seguiría escribiendo en el tamaño añadido, mientras que el segundo proceso también seguiría leyendo.

Puedes hacerlo. Pero es mejor asignar más de una vez. Funcionará más rápido. Lo tengo implementado en la misma biblioteca.
 
Zhunko:
Sí, puedes hacerlo. Pero es mejor asignar un tamaño mayor de una vez.

Erm, eso es un poco de un nombre equivocado.

El mapeo no tiene ningún tamaño, sólo se especifica el tamaño máximo en la creación, normalmente (y por defecto) igual al tamaño del archivo con el que estamos trabajando.

El tamaño de la vista se establece en la creación y se puede cambiar sin la función UnmapViewOfFile sólo en caso de chamanismo con banderas de acceso, y tal vez incluso imposible.

¿Y por qué cambiar el tamaño?

 
Zhunko:
Sí, podemos.
¿Cómo? No me mandes a MSDN y a Google, que llevo medio día allí.

TheXpert:

Erm, eso es un poco de un nombre equivocado.

El mapeo no tiene ningún tamaño, sólo se especifica un tamaño máximo en la creación, normalmente (y por defecto) igual al tamaño del archivo con el que se está trabajando.

Ese es el punto. Escribí que el tamaño = 100 bytes cuando lo creé.
en segundo lugar, no estoy trabajando con un archivo físico, sino sólo con la memoria. un proceso pasa la información a otro proceso.

¿Y por qué cambiar el tamaño?

Durante el funcionamiento, la memoria asignada se llena hasta los 100 bytes. Pero aparecen nuevos datos y, en consecuencia, hay que añadirlos. Así que tenemos que ampliar este tamaño para añadirlos.

Por eso pregunto: cómo ampliar los 100 bytes que he asignado sin copiar y recrear intermedios.

Lo tengo con la vista. Sólo necesito recrearlo. Pero, ¿qué pasa con el propio objeto CreateFileMapping? ¿Se puede ampliar sin cerrarlo?

 
Aparentemente, el tamaño del mapeo está establecido en un tamaño fijo en Create.
.
Probablemente sólo pueda recrear.
.
PERO: si crea un archivo disperso de gran tamaño (por ejemplo, 2 gigabytes),
estará bien. Pero el final del archivo debe entenderse fuera del tamaño del archivo del sistema.
.
Pero entonces ya habría que preguntarse cómo sincronizar el proceso de lectura del archivo-
es decir, cómo saber qué parte de los datos se escribe y dónde.
 

En general, no es necesario un volumen así.

Los procesos simplemente escriben/leen de forma asíncrona. Y necesitamos una forma de que el escritor no esté descontento mientras el lector espera a que se escriban todos los datos.

Es decir, se necesita algo como ArrayResize para ampliar el array sin cambiar su contenido. una vez que el lector ha cogido todos los datos, toda la memoria está disponible para escribir de nuevo desde el principio.

 
jartmailru:

Pero entonces hay que preguntarse cómo sincronizar el proceso de lectura del archivo -
es decir, cómo saber que un dato ha sido escrito y dónde.

He resuelto este problema de inmediato.

pero todavía no con el cambio de tamaño dinámico :(

Si Vadim (Zhunko) es tan generoso, espero que me diga qué funciones utilizar...
 
Repito: existen los archivos Sparse...
Esto significa que un archivo de 2 gigas ocupa 0 bytes en el disco.

Hmm. ¿No se puede establecer el archivo al tamaño máximo
de datos a transferir?
 
jartmailru:
Repito: existen los archivos Sparse...
Significa que un archivo de 2 gigas ocupa 0 bytes en el disco.

No uso archivos, todo se hace a través de la memoria. Ya he escrito arriba tres veces.

// si es más fácil

CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, FILE_SIZE, "Local\page");

Tengo problemas con este FILE_SIZE.

¿Y no se puede configurar el archivo con el tamaño máximo de los datos a transferir?
la cantidad de datos no se conoce de antemano.
Estoy leyendo sobre Sparse, tal vez sean útiles si pueden expandirse dinámicamente.
 
sergeev:

Esa es la cuestión. Te dije que el tamaño estaba fijado en 100 bytes.

En segundo lugar, no estoy trabajando con un archivo físico, sólo con la memoria. un proceso pasa información a otro proceso.

¿Cuál es la diferencia? La esencia es la misma, sólo que la información se escribe en la memoria y no en el disco. De todos modos, estamos trabajando con un mango abierto a través de CreateFile.

Allí (al crear un archivo en memoria) es necesario especificar el tamaño máximo posible, por encima del cual exactamente no habrá información.

Mientras trabajas, la memoria asignada se llena hasta los 100 bytes.

¿Y cuál es el problema? Hice otra vista con un desplazamiento de 100bytes, pero el tamaño del mapeo (es decir, del archivo) debería tenerlo en cuenta de antemano.

Lo tengo con la vista. Pero, ¿qué pasa con el propio objeto CreateFileMapping? ¿Se puede ampliar sin cerrarlo?

Ampliarlo es un error, su tamaño ya debería tenerlo en cuenta.
 
TheXpert:
Ampliarlo es un error, su tamaño ya debería tenerlo en cuenta.
parece ser la única opción.