Aplicación intensiva en computación: carga contra consulta de la base de datos

7

Mi empresa tiene un conjunto de aplicaciones maduras (raíces desde hace más de 15 años), intensivas en computación (simulaciones) que utilizamos para realizar trabajos de consultoría. Trabajo en el lado de simulación / consultoría de la casa, no en el lado de desarrollo de software. Hace poco aprendí sobre una característica particular de la arquitectura que me preocupa: nuestro gran conjunto de datos de entrada (200-500MB, a veces más) se carga primero por completo en la memoria desde la base de datos. Luego, el motor de simulación accede a los datos de entrada desde la memoria a medida que avanza.

Me pareció una "optimización pre-madura" y / o una idea pasada de moda, ya que creo que hay servidores de bases de datos que pueden ser bastante rápidos. La arquitectura causa otro problema, ya que nuestra base de datos de simulación solo puede ser tan grande (un poco más de un GB) antes de que un simulador no pueda ejecutarse. El arquitecto jefe es un científico, no un desarrollador de software, y un tanto temerario, por lo que estoy buscando comentarios de la comunidad sobre esta pregunta.

¿Nos está perjudicando nuestra arquitectura? ¿Hay algún documento / trabajo / prueba sobre el tema: compensaciones entre la lectura de la base de datos sobre la marcha y una copia de la base de datos en la memoria? Cualquier comentario o percepción sería apreciada. Me gustaría formarme antes de abordar el problema con mi empresa.

    
pregunta Pete 05.05.2011 - 16:32

4 respuestas

2
  

¿Nos está perjudicando nuestra arquitectura?

No.

  

¿Hay algún documento / trabajo / prueba sobre el tema: compensaciones entre la lectura de la base de datos sobre la marcha y una copia de la base de datos en la memoria?

Sí. Cientos.

Es por eso que las bases de datos almacenan cosas en caché. Cuanta más base de datos haya en la memoria, más rápido funcionará la base de datos.

Todos los algoritmos inteligentes de almacenamiento en caché (LRU, etc.) están diseñados para lograr un rendimiento bastante bueno con un uso bastante bueno de la memoria. Para un producto de base de datos de propósito general, esto puede implicar algunas concesiones interesantes.

Sin embargo, para su aplicación, poner todo en la memoria es claramente óptimo. No hay compensación. Ya has alcanzado el límite superior de rendimiento.

  

Cualquier comentario o percepción sería apreciada.

Reemplazar tu todo en memoria con cualquier otra cosa puede implicar más E / S y, por lo tanto, ser más lento.

Hay algunas cosas que puedes hacer si quieres acelerar el proceso.

  1. No cargue archivos a una base de datos y luego consulte la base de datos para crear la estructura en memoria. Solo carga los archivos en la memoria. Mucho más rápido.

  2. Si es posible, divida su procesamiento para crear una canalización a nivel del sistema operativo donde los resultados parciales se leen desde stdin y los resultados se escriben en la salida estándar. Una serie de etapas de canalización consumirá más núcleos y más memoria, lo que a menudo conducirá a un rendimiento mejorado.

respondido por el S.Lott 05.05.2011 - 16:50
6

Una base de datos en la memoria tiene el potencial de ser más rápida que una en un disco duro. También hay opciones para hacer una mezcla.

En cualquier caso, hay muchos más factores que podrían estar eliminando la opción de disco duro. Yo sugeriría que el arquitecto jefe se encargue de la arquitectura, (será muy duro si intentas hacer su trabajo). En su lugar, enfóquese en la limitación de tamaño y el plan de negocios. Tráigale el problema (necesita simular conjuntos de datos de más de 1 GB) y déjelo encontrar una solución.

    
respondido por el jzd 05.05.2011 - 16:42
4

No soy un experto en esta área en particular, pero no puedo ver nada que supere el "enfoque de memoria". Sí, tiene un inicio lento de carga de todos esos datos, pero una vez que está allí, su tiempo de recuperación de datos es básicamente de 0. Si está ejecutando la base de datos en otra cosa que no sea la misma máquina que la simulación, introduzca la latencia de la red en la ecuación. p>

Sin una verdadera comprensión de los datos y lo que está simulando y cómo, esta sugerencia puede o no valer la pena. Puede cargar grandes cantidades de datos a la vez, es decir, cargar 100MB / X filas de datos, comenzar a procesarlos y luego tener listos los siguientes 100MB para ser procesados al final del primer lote.

    
respondido por el Kevin D 05.05.2011 - 16:42
3

El problema es que necesita trabajar con conjuntos de datos de más de 1 GB. Para hacer esto, tendrá que dividir los datos en partes más pequeñas y manejables. Entonces, su problema principal será si los algoritmos pueden funcionar con datos parciales o no.

Si requieren que todos los datos se lean en la memoria, se necesitará una reescritura importante de la aplicación para cambiar esto. Tendrá que ser capaz de leer un subconjunto del proceso de datos que luego se repetirá hasta que se procesen todos los datos. Una vez que se procesa cada parte, deberá combinar los resultados.

No es tan simple como cambiar la forma en que lees los datos de la base de datos.

    
respondido por el ChrisF 05.05.2011 - 16:43

Lea otras preguntas en las etiquetas