Sto programmando di archiviare scansioni da uno spettrometro di massa in un database MySQL e vorrei sapere se archiviare e analizzare questa quantità di dati è fattibile da remoto. So che le prestazioni variano notevolmente a seconda dell'ambiente, ma sto cercando l'ordine approssimativo di grandezza: le query impiegheranno 5 giorni o 5 millisecondi?
Formato di input
Ogni file di input contiene una singola corsa dello spettrometro; ogni esecuzione è composta da una serie di scansioni e ogni scansione ha una matrice ordinata di punti dati. Ci sono un po 'di metadati, ma la maggior parte del file è composta da array o float a 32 o 64 bit.
Sistema host
| ---------------- + ------------------------------- | | OS | Windows 2008 a 64 bit | | Versione MySQL | 5.5.24 (x86_64) | | CPU | 2x Xeon E5420 (8 core in totale) | | RAM | 8GB | | File system SSD | 500 GiB | | RAID HDD | 12 TiB | | ---------------- + ------------------------------- |
Esistono altri servizi in esecuzione sul server che utilizzano un tempo del processore trascurabile.
Statistiche dei file
| ------------------ + -------------- | | numero di file | ~ 16.000 | | dimensione totale | 1.3 TiB | | dimensione minima | 0 byte | | dimensione massima | 12 GiB | | media | 800 MiB | | mediana | 500 MiB | | punti dati totali | ~ 200 miliardi | | ------------------ + -------------- |
Il numero totale di punti dati è una stima molto approssimativa.
Schema proposto
Sto programmando di fare le cose "giuste" (cioè normalizzare i dati come un matto) e quindi avremmo una runs
tabella, una spectra
tabella con una chiave esterna a runs
e una datapoints
tabella con una chiave esterna a spectra
.
La domanda da 200 miliardi di punti dati
Analizzerò su più spettri e forse anche più sequenze, risultando in query che potrebbero toccare milioni di righe. Supponendo che indicizzo tutto correttamente (che è un argomento per un'altra domanda) e non sto cercando di mescolare centinaia di MiB attraverso la rete, è plausibile che MySQL sia in grado di gestirlo?
informazioni addizionali
I dati di scansione verranno dai file nel formato mzML basato
su XML. La carne di questo formato è negli
<binaryDataArrayList>
elementi in cui sono memorizzati i dati. Ogni scansione produce> = 2 <binaryDataArray>
elementi che, presi insieme, formano un array bidimensionale (o più) del modulo [[123.456, 234.567, ...], ...]
.
Questi dati vengono scritti una sola volta, quindi le prestazioni di aggiornamento e la sicurezza delle transazioni non rappresentano problemi.
Il mio piano ingenuo per uno schema di database è:
runs
tavolo
| nome della colonna | digitare | | ------------- + ------------- | | id | CHIAVE PRIMARIA | | start_time | TIMESTAMP | | nome | VARCHAR | | ------------- + ------------- |
spectra
tavolo
| nome della colonna | digitare | | ---------------- + ------------- | | id | CHIAVE PRIMARIA | | nome | VARCHAR | | indice | INT | | tipo_ spettro | INT | | rappresentazione | INT | | run_id | CHIAVE ESTERA | | ---------------- + ------------- |
datapoints
tavolo
| nome della colonna | digitare | | ------------- + ------------- | | id | CHIAVE PRIMARIA | | spettro_id | CHIAVE ESTERA | | mz | DOUBLE | | num_counts | DOUBLE | | indice | INT | | ------------- + ------------- |
È ragionevole?
Quindi, come potresti aver potuto dedurre, io sono il programmatore, non il biologo in laboratorio, quindi non conosco la scienza tanto quanto i veri scienziati.
Ecco un diagramma di un singolo spettro (scansione) del tipo di dati con cui tratterò:
L'obiettivo del software è capire dove e quanto siano significativi i picchi. Usiamo un pacchetto software proprietario per capirlo ora, ma vogliamo scrivere il nostro programma di analisi (in R) in modo da sapere cosa diavolo sta succedendo sotto i fogli. Come puoi vedere, la stragrande maggioranza dei dati non è interessante, ma non vogliamo buttare via dati potenzialmente utili che il nostro algoritmo ha perso. Una volta che abbiamo un elenco di probabili picchi di cui siamo soddisfatti, il resto della pipeline utilizzerà tale elenco di picco anziché l'elenco non elaborato di punti dati. Suppongo che sarebbe sufficiente memorizzare i punti dati grezzi come un grande BLOB, in modo che possano essere rianalizzati se necessario, ma mantenere solo i picchi come voci distinte del database. In quel caso, ci sarebbero solo un paio di dozzine di picchi per spettro, quindi la roba del ridimensionamento pazzo non dovrebbe