Resumen Mapear ficheros en memoria

Mensaje enviado por "Nharkor" <mmm@iberdrolaingenieria.es>

Se me ocurren dos maneras de hacerlo.

1) Utilizando ficheros pero en modo FileMapping
Se puede mapear en memoria un fichero de disco. Esto hace que los datos del
mismo se mapeen en la memoria del sistema, implementandose así una especie de memoria compartida.
El acceso a los datos es rapidísimo, pues practicamente es el mismo que si se accediese a la memoria.
El concepto es el siguiente: cada proceso (en la misma maquina o en maquinas remotas) crea un FileMapping del archivo, y después un FileView que es como una vista del archivo.
Cuando se lee o se escribe en el fichero se hace siempre a través de este FileView, que en realidad es un puntero a memoria, esto es, estas escribiendo y leyendo en la memoria, no en el disco.
El sistema actualiza automáticamente los FileViews de los demás procesos, y cada cierto tiempo vuelca el contenido de la memoria sobre el fichero en disco (que es lo mismo que hace el Windows con el fichero de swapping).
Pero hay una pega importante: cuando los procesos estan en maquinas distintas el FileView no se actualiza de forma automática y lo tienes que hacer tu a mano o de lo contrario las vistas se te quedarían estáticas con los datos de cuando se crearon.
Tendrías que hacer algo para refrescarlos tu manualmente....

Por si te interesa, te cuento como se haría.
Tendrías por tanto que crear un fichero con la API CreateFile, después mapear ese fichero con CreateFileMapping y definir la vista con CreateViewOfFile.
Ese fichero deberá estar localizado en un disco de red, accesible por todos los PC's.
Lo mejor sería compartir un directorio local en el PC servidor (el que toma y graba los datos para que vaya mas rápido.
Los PC's remotos harían lo mismo, pero especificarían como ruta del FileMapping una ruta de red.
Asi el acceso es muy , muy rápido. A lo mejor todo esto te suena a chino, pero cuando mires las API verás como funciona.

2) En mi caso tuve un problema parecido y opté por crearme un proceso servidor TCP-IP combinado con la técnica anterior. En la misma maquina donde corre tu programa te creas otro que actua como servidor TCP.
Ambos programas comparte la matriz esa con los datos a través de un FileMapping.
No es necesario definir un fichero si pones como handle 0xFFFFFF. O sea, estarias literalmente compartiendo la memoria que ocupa la matriz.
Después mediante un objeto de sincronización Windows ( un semáforo o mejor un EventObject), tu programa avisa al servidor cada vez que ha actualizado
los datos. Entonces el servidor los coje y los envia por TCP-IP a los clientes que esten conectados con él.
Obviamente sobre cada PC remoto tendrias que definirte un programilla que actuase como
cliente, o sea, que se conecte con el servidor sobre un puerto determinado y permanezca a la escucha.
Con el control Winsock del VB puedes programar ambos: cliente y servidor, aunque mejor si lo metes todo en una DLL en C, pues va mucho mas rápido.

3) La tercera posibilidad es la que tu dices. Pones un fichero en red y sobre él escribe tu programa y leen todos los demás. Puedes acelerar las escrituras y lecturas si utilizas las API de Windows: ReadFile, WriteFile, OpenFile...
Puedes bloquear el fichero durante la escritura con LockFile, y desbloquearlo después con UnlockFile....
En fin, que si usas las API la cosa ira bastante rápido y no creo que sufras bloqueos de ningun tipo.

Espero que te sirva de algo.
Un saludo.


----- Mensaje original -----
De: <eusebi@infomail.lacaixa.es>
Para: <vb-esp@ccc.uba.ar>
Enviado: lunes 20 de marzo de 2000 18:35
Asunto: vb-esp : Programa en red


Hola lista.

He programado una aplicación en vb16 que lee las entradas digitales que recibe una tarjeta que hay instalada en el ordenador (486) y las va procesando, y cada turno (8 horas) hace un volcado al disco duro, y empieza de nuevo. Hasta aquí ningún problema, pero ahora necesito poder ver en tiempo real los datos que ya tiene procesados el programa desde el inicio de turno desde cualquier ordenador que esté conectado a
la red (interna) de la empresa, (y no me vale usar un programa de los que monitorizan la pantalla de otro ordenador), los datos en cuestión quedan "resumidos" a una matriz tipo dim X(10,50,4) as Long. Mi idea seria grabarlos en disco cada 30 o 60 seg. Y crear un programa que fuera leyendo estos archivos, pero veo varios posibles inconvenientes:
- Posibles problemas de lectura-escritura al leer uno y grabar el otro al mismo tiempo.
- No es en tiempo real.
- Posible saturacion del ordenador al tener que estar grabando (además de todo lo que hace actualmente) continuamente.
 Este es lo que hay, y mi pregunta es que si alguien ha tenido que programar una aplicación de este tipo o se le ocurre como hacerlo le agradecería que me echara un cable, unas ideas o un código o lo que sea.

Un saludo.

Eusebi Cantabrana eusebi@infomail.lacaixa.es




Resumen Resumen

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com