Estoy planeando almacenar escaneos desde un espectrómetro de masas en una base de datos MySQL y me gustaría saber si almacenar y analizar esta cantidad de datos es remotamente factible. Sé que el rendimiento varía enormemente según el entorno, pero estoy buscando el orden aproximado de magnitud: ¿las consultas demorarán 5 días o 5 milisegundos?
Formato de entrada
Cada archivo de entrada contiene una sola ejecución del espectrómetro; cada corrida se compone de un conjunto de escaneos, y cada escaneo tiene una matriz ordenada de puntos de datos. Hay un poco de metadatos, pero la mayoría del archivo se compone de matrices de 32 o 64 bits ints o flotantes.
Sistema host
| ---------------- + ------------------------------- | El | OS | Windows 2008 de 64 bits | El | Versión MySQL | 5.5.24 (x86_64) | El | CPU | 2x Xeon E5420 (8 núcleos en total) | El | RAM | 8GB | El | Sistema de archivos SSD | 500 GiB | El | RAID HDD | 12 TiB | | ---------------- + ------------------------------- |
Hay algunos otros servicios que se ejecutan en el servidor con un tiempo de procesador insignificante.
Estadísticas de archivo
| ------------------ + -------------- | El | número de archivos | ~ 16,000 | El | tamaño total | 1.3 TiB | El | tamaño min | 0 bytes | El | tamaño máximo | 12 GiB | El | media | 800 MiB | El | mediana | 500 MiB | El | puntos de datos totales | ~ 200 mil millones | | ------------------ + -------------- |
El número total de puntos de datos es una estimación muy aproximada.
Esquema propuesto
Estoy planeando hacer las cosas "bien" (es decir, normalizar los datos como locos) y, por lo tanto, tendría una runs
tabla, una spectra
tabla con una clave foránea runs
y una datapoints
tabla con una clave foránea spectra
.
La pregunta de 200 mil millones de puntos de datos
Voy a analizar múltiples espectros y posiblemente incluso múltiples ejecuciones, lo que dará como resultado consultas que podrían tocar millones de filas. Suponiendo que indexo todo correctamente (que es un tema para otra pregunta) y no estoy tratando de mezclar cientos de MiB en la red, ¿es remotamente posible que MySQL maneje esto?
información adicional
Los datos de escaneo provendrán de archivos en formato mzML basado en
XML . La carne de este formato está en los
<binaryDataArrayList>
elementos donde se almacenan los datos. Cada exploración produce> = 2 <binaryDataArray>
elementos que, tomados en conjunto, forman una matriz bidimensional (o más) de la forma [[123.456, 234.567, ...], ...]
.
Estos datos son de escritura única, por lo que el rendimiento de la actualización y la seguridad de las transacciones no son una preocupación.
Mi plan ingenuo para un esquema de base de datos es:
runs
mesa
El | nombre de columna | tipo | | ------------- + ------------- | El | id | CLAVE PRIMARIA | El | hora_inicio | TIMESTAMP | El | nombre | VARCHAR | | ------------- + ------------- |
spectra
mesa
El | nombre de columna | tipo | | ---------------- + ------------- | El | id | CLAVE PRIMARIA | El | nombre | VARCHAR | El | indice | INT | El | espectro_tipo | INT | El | representación | INT | El | run_id | CLAVE EXTRANJERA | | ---------------- + ------------- |
datapoints
mesa
El | nombre de columna | tipo | | ------------- + ------------- | El | id | CLAVE PRIMARIA | El | espectro_id | CLAVE EXTRANJERA | El | mz | DOBLE | El | num_counts | DOBLE | El | indice | INT | | ------------- + ------------- |
¿Es esto razonable?
Entonces, como habrás podido inferir, soy el programador, no el biólogo en el laboratorio, por lo que no conozco la ciencia tan bien como los científicos reales.
Aquí hay una gráfica de un solo espectro (escaneo) del tipo de datos con los que me ocuparé:
El objetivo del software es descubrir dónde y cuán significativos son los picos. Usamos un paquete de software patentado para resolver esto ahora, pero queremos escribir nuestro propio programa de análisis (en R) para saber qué diablos está pasando debajo de las hojas. Como puede ver, la gran mayoría de los datos no son interesantes, pero no queremos arrojar datos potencialmente útiles que nuestro algoritmo perdió. Una vez que tengamos una lista de picos probables con los que estamos satisfechos, el resto de la tubería utilizará esa lista de picos en lugar de la lista sin procesar de puntos de datos. Supongo que sería suficiente almacenar los puntos de datos sin procesar como un gran blob, para que se puedan volver a analizar si es necesario, pero mantenga solo los picos como entradas de base de datos distintas. En ese caso, solo habría un par de docenas de picos por espectro, por lo que las cosas locas de escalado no deberían