[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [OT] Es mejor un archivo grande o muchos pequeños



El día 18 de diciembre de 2014, 10:40, Edwin De La Cruz
<edwinspire@gmail.com> escribió:
> El 17 de diciembre de 2014, 20:11, Agustín Ruatta
> <agustinruatta@gmail.com> escribió:
>>
>>
>> El 16/12/14 a las 14:52, Edwin De La Cruz escibió:
>>
>>> Saludos cordiales.
>>> Antes que nada me disculpo por el OT, pero es que no se donde o como buscar.
>>> El asunto es el siguiente:
>>> Estoy haciendo una aplicación que a su vez tiene varios hilos corriendo a la vez, estos hilos generan cierta informacion que necesito almacenar.
>>> He probado con SQLite, pero tengo problemas ya que algunas (muchas) veces cuando uno de los hilos de la aplicación necesita insertar información en la base de datos falla ya que se encuentra bloqueada por otro hilo.
>>>
>>> He subido el timeout pero solo ha mejorado un poco. Tambien tengo algo de temor ya que he leido que la base de datos podria corromporse si en un momento dos procesos escriben a la vez en la base de datos.
>>>
>>> Actualmente para este fin uso PostgreSQL, sin ningun problema, pero o que necesito es hacer la aplicacion mas independiente y facil de instalar, configurar, etc.
>>>
>>> He pensado en usar XML para cada registro que la aplicacion genera, de este modo ya no hay peligro de corrupcion de datos, como podria suceder en el caso de SQLite.
>>>
>>> La Pregunta es la siguiente: es pesado (lento) para el procesador el tener que leer o copiar cientos o miles de archivos individuales, lo pregunto porque me ha pasado que cuando copio alguna carpeta que contiene ciento de archivos, todos menores a 10K, el proceso es muy muy lento.
>>>
>>> Espero no molestar mucho con esta pregunta y ojala alguien me pueda dar una idea de que camino seguir.
>>>
>>> Gracias y saludos desde Ecuador.
>>>
>>> Mis proyectos de software libre en:
>>> Github - edwinspire
>>
>>
>> Si no entiendo mal, estas desarrollando una aplicación la cual tiene varios hilos que necesitan guardar información en algún lugar. Y por lo que veo, te has decantado por usar una Base de Datos (Pero que te trae el problema del bloqueo que se produce cuando dos o mas hilos intentan escribir al mismo tiempo). Si es así el caso, creo que no debes atacar a la configuración de la Base de Datos, sino mas bien a como has diseñado tu programa.
>>
>> De mi parte te recomendaría que crees una estructura de datos y que ésta sea una cola. Los diferentes hilos no escriben directamente a la Base de Datos, sino que encolan en dicha estructura de datos las peticiones para grabar esa información en la Base de Datos.
>>
>> Para ser mas claro: supongamos que estas programando en C++ o Java (o cualquier otro lenguaje orientado a objetos). Por un lado vas a tener unas cierta cantidad de clases que van a generar esa información para grabarla en la Base de Datos (Llamésmola CLASES PETICIONADORAS). Por otro lado vas a tener una clase COLA (por ponerle algún nombre, aunque obviamente deberías ponerle un nombre más significativo). Cuando alguna de las CLASES PETICIONADORAS necesite grabar alguna información lo que va a hacer es pasarle esa petición la clase COLA (Es decir, cualquiera de los hilos que necesite grabar, va a pasarle esa petición a la clase COLA. Vale aclarar que esta clase debería ser única -Ayuda: usa el patrón de diseño Singleton para garantizar que dicha instancia sea única- ). Con respecto al proceso de grabado, deberías tener otra clase (llamésmole clase GRABADORA) que itera siempre ( como por ejemplo con un bucle while(true) ) observando si hay alguna petición en la cola (Esta clase también debe ser única -Aplicá patrón Singleton- ). Su hay una (o más de una) petición, la clase GRABADORA la registrará en la Base de Datos. Entonces vas a tener un solo hilo que te va a grabar los registros en la Base de Datos (Evitando así todos los problemas de bloque o corrompimiento de datos que puedas tener, ya que vas a grabar un solo registro a la vez -Debido a que un solo objeto estará accediendo a la Base de Datos en un mismo momento- ). No tengas miedo de que ésta pueda ser muy lento: tanto la clase COLA como la clase GRABADORA van a tener su hilo propio. Ésto te garantizará que apenas haya una petición la clase COLA, sea registrada inmediatamente por la clase GRABADORA.
>>
>> Además, usando este diseño vas a encapsular como registras esa información. Solo la clase GRABADORA va a saber si se graba la información en una Base de Datos, en un archivo XML o de alguna otra forma. Si en un futuro tenés que modificar el medio de almacenamiento (o cambiar la Base de Datos), sólo vas a tener que modificar dicha clase y no en todas las partes del programa.
>>
>> Un último consejo que te doy. Usar while(true) en la clase GRABADORA no es un buen mecanismo para estar viendo constantemente si hay peticiones en la clase COLA (Ya que desperdicia muchos recursos). Te recomendaría que uses el patrón de diseño Observer para que la clase GRABADORA sea notificada de que hay peticiones para grabar en la Base de Datos. Cuando se añade una petición a la clase COLA, se notifica a la clase GRABADORA, y ésta va a iterar mientras haya peticiones en la clase COLA que haya que registrar en la Base de Datos. Una vez que terminó de registrar todas las peticiones, deja de iterar, a la espera de que sea nuevamente notificada y vuelva a grabar las peticiones.
>>
>> Como podes ver, ésta solución esta adaptada para un lenguaje de programación orientada a objetos (Debido a que estoy acostumbrado a programar en éste paradigma). Si estas programando en otro paradigma (Como por ejemplo, estas programando en C) vas a tener que adaptar el diseño a dicho paradigma (Y al lenguaje en si). Sin embargo la esencia de la solución (De tener un solo punto de entrada para registrar en la Base de Datos, usando una estructura cola, para así evitar los problemas de bloqueo) es siempre la misma.
>>
>> Si lo programas en un lenguaje orientado a objetos, sentite libre a crear clase nuevas (Por ejemplo encapsular las peticiones en una clase Petición). Si tienes un poco de experiencia programando te darás cuenta que clases te van a ayudar a abstraer y ocultar la información.
>>
>> Espero que te sirva de algo, y disculpa que no te responda lo que específicamente preguntaste, pero creo que por ahí esto te puede ayudar más que estar renegando de como configurar la Base de Datos.
>>
>> Si no se entendió algo o tienes alguna duda, no dudes en preguntar por la lista ;) .
>>
>> ¡Saludos!

La aplicacion esta creada en Vala, es el lenguaje que utilizo, es
Orientada a Objetos tambien.
Habia pensado en hacer lo que me sugieres, crear un punto comun y
unico de entrada para los datos y de esa pila irlos guardando en la
base de datos, me parece que seria una buena opcion.

En un mensaje anterior me indicaron que SQLite soporta multithread,
ayer me puse a revisar detenidamente la documentacion al respecto y
creo que resolveria mi problema, siempre y cuando abra la base de
datos desde mi aplicacion y ella sea la unica que lee o escribe.
No he buscado aun ejemplos de codigo para hacer pruebas, quiero
forzarle al maximo. Sé que el Linux SQlite funciona sin problemas, es
mas bien en Winbugs donde la quiero probar, en estos dias voy a tener
que instalarlo en una maquina virtual para probar.

Agradezco los comentarios, seguiré investigando más, me han dado una
mejor idea de por donde ir.


Reply to: