Estou pensando em armazenar varreduras de um espectrômetro de massa em um banco de dados MySQL e gostaria de saber se armazenar e analisar essa quantidade de dados é remotamente viável. Sei que o desempenho varia muito dependendo do ambiente, mas estou procurando uma ordem aproximada de magnitude: as consultas levarão 5 dias ou 5 milissegundos?
Formato de entrada
Cada arquivo de entrada contém uma única execução do espectrômetro; cada execução é composta por um conjunto de varreduras e cada varredura possui uma matriz ordenada de pontos de dados. Existem alguns metadados, mas a maioria do arquivo é composta de matrizes de 32 ou 64 bits ou flutuações.
Sistema host
| ---------------- + ------------------------------- | | OS Windows 2008 de 64 bits | | Versão do MySQL | 5.5.24 (x86_64) | | CPU 2x Xeon E5420 (total de 8 núcleos) | | RAM 8GB | | Sistema de arquivos SSD | 500 GiB | | RAID HDD | 12 TiB | | ---------------- + ------------------------------- |
Existem alguns outros serviços em execução no servidor usando um tempo insignificante do processador.
Estatísticas do arquivo
| ------------------ + -------------- | | número de arquivos | ~ 16.000 | | tamanho total | 1,3 TiB | | tamanho mínimo | 0 bytes | | tamanho máximo | 12 GiB | | significa | 800 MiB | | mediana | 500 MiB | | pontos de dados totais | ~ 200 bilhões | | ------------------ + -------------- |
O número total de pontos de dados é uma estimativa muito aproximada.
Esquema proposto
Estou planejando fazer as coisas "corretamente" (ou seja, normalizar os dados como loucos) e, portanto, teria uma runs
tabela, uma spectra
tabela com uma chave estrangeira para runs
e uma datapoints
tabela com uma chave estrangeira para spectra
.
A questão dos 200 bilhões de pontos de dados
Vou analisar vários espectros e possivelmente várias execuções, resultando em consultas que podem tocar milhões de linhas. Supondo que eu indexe tudo corretamente (que é um tópico para outra pergunta) e não estou tentando embaralhar centenas de MiB pela rede, é remotamente plausível para o MySQL lidar com isso?
informação adicional
Os dados da varredura serão provenientes de arquivos no formato mzML baseado em XML
. A carne desse formato está nos
<binaryDataArrayList>
elementos em que os dados são armazenados. Cada varredura produz> = 2 <binaryDataArray>
elementos que, juntos, formam uma matriz bidimensional (ou mais) do formulário [[123.456, 234.567, ...], ...]
.
Esses dados são gravados uma vez, portanto, o desempenho da atualização e a segurança das transações não são preocupações.
Meu plano ingênuo para um esquema de banco de dados é:
runs
mesa
| nome da coluna | tipo | | ------------- + ------------- | | id | CHAVE PRIMÁRIA | | start_time | TIMESTAMP | | nome | VARCHAR | ------------- + ------------- |
spectra
mesa
| nome da coluna | tipo | | ---------------- + ------------- | | id | CHAVE PRIMÁRIA | | nome | VARCHAR | índice | INT | spectrum_type | INT | representação | INT | run_id | CHAVE ESTRANGEIRA | | ---------------- + ------------- |
datapoints
mesa
| nome da coluna | tipo | | ------------- + ------------- | | id | CHAVE PRIMÁRIA | | spectrum_id | CHAVE ESTRANGEIRA | | mz | DUPLO | | num_counts | DUPLO | | índice | INT | ------------- + ------------- |
Isso é razoável?
Então, como você pode deduzir, sou o programador, não o biólogo do laboratório, por isso não conheço a ciência tão bem quanto os cientistas de verdade.
Aqui está um gráfico de um único espectro (varredura) do tipo de dados com o qual tratarei:
O objetivo do software é descobrir onde e quão significativos são os picos. Usamos um pacote de software proprietário para descobrir isso agora, mas queremos escrever nosso próprio programa de análise (em R) para saber o que diabos está acontecendo embaixo das folhas. Como você pode ver, a grande maioria dos dados é desinteressante, mas não queremos descartar dados potencialmente úteis que nosso algoritmo perdeu. Depois que tivermos uma lista de picos prováveis com os quais estamos satisfeitos, o restante do pipeline usará essa lista de picos, em vez da lista bruta de pontos de dados. Suponho que seria suficiente armazenar os pontos de dados brutos como um grande blob, para que eles possam ser analisados novamente, se necessário, mas mantenha apenas os picos como entradas distintas do banco de dados. Nesse caso, haveria apenas algumas dúzias de picos por espectro, então o material de escala maluco não deveria