Je prévois de stocker les analyses d'un spectromètre de masse dans une base de données MySQL et je voudrais savoir si le stockage et l'analyse de cette quantité de données sont réalisables à distance. Je sais que les performances varient énormément en fonction de l'environnement, mais je recherche un ordre de grandeur approximatif: les requêtes prendront-elles 5 jours ou 5 millisecondes?
Format d'entrée
Chaque fichier d'entrée contient une seule exécution du spectromètre; chaque exécution comprend un ensemble d'analyses et chaque analyse comporte un tableau ordonné de points de données. Il y a un peu de métadonnées, mais la majorité du fichier est composée de tableaux de 32 ou 64 bits ou flottants.
Système hôte
| ---------------- + ------------------------------- | | OS | Windows 2008 64 bits | | Version de MySQL | 5.5.24 (x86_64) | | CPU | 2x Xeon E5420 (total de 8 noyaux) | | RAM | 8 Go | | Système de fichiers SSD | 500 GiB | | HDD RAID | 12 TiB | | ---------------- + ------------------------------- |
Certains services exécutés sur le serveur utilisent un temps de traitement négligeable.
Fichier statistique
| ------------------ + -------------- | | nombre de fichiers | ~ 16 000 | | taille totale | 1,3 TiB | | taille min | 0 octet | | taille maximale | 12 GiB | | moyenne | 800 MiB | | médiane | 500 Mio | | points de données totaux | ~ 200 milliards | | ------------------ + -------------- |
Le nombre total de points de données est une estimation très approximative.
Schéma proposé
Je prévois de faire les choses «correctement» (c’est-à-dire de normaliser les données de manière folle) et d’avoir un runs
tableau, un spectra
tableau avec une clé étrangère runs
et un datapoints
tableau avec une clé étrangère spectra
.
La question des 200 milliards de points de données
Je vais analyser plusieurs spectres et éventuellement plusieurs analyses, ce qui entraînera des requêtes pouvant toucher des millions de lignes. En supposant que j'indexe tout correctement (ce qui est un sujet pour une autre question) et que je n'essaye pas de mélanger des centaines de MiB sur le réseau, est-il plausible à distance pour MySQL de gérer cela?
information additionnelle
Les données de numérisation proviendront de fichiers au format XML XML
. La viande de ce format est dans les
<binaryDataArrayList>
éléments où les données sont stockées. Chaque analyse produit> = 2 <binaryDataArray>
éléments qui, pris ensemble, forment un tableau à 2 dimensions (ou plus) de la forme [[123.456, 234.567, ...], ...]
.
Ces données sont écrites une seule fois. Les performances de mise à jour et la sécurité des transactions ne sont donc pas un sujet de préoccupation.
Mon plan naïf pour un schéma de base de données est le suivant:
runs
table
| nom de colonne | type | | ------------- + ------------- | | id | CLÉ PRIMAIRE | | heure_départ | TIMESTAMP | | nom | VARCHAR | | ------------- + ------------- |
spectra
table
| nom de colonne | type | | ---------------- + ------------- | | id | CLÉ PRIMAIRE | | nom | VARCHAR | | index | INT | | spectre_type | INT | | représentation | INT | | run_id | CLÉ ÉTRANGÈRE | | ---------------- + ------------- |
datapoints
table
| nom de colonne | type | | ------------- + ------------- | | id | CLÉ PRIMAIRE | | spectre_id | CLÉ ÉTRANGÈRE | | mz | DOUBLE | | num_counts | DOUBLE | | index | INT | | ------------- + ------------- |
Est-ce raisonnable?
Ainsi, comme vous l'avez peut-être pu déduire, je suis le programmeur, pas le biologiste du laboratoire. Je ne connais donc pas la science aussi bien que les scientifiques.
Voici un graphique d'un seul spectre (scan) du type de données avec lequel je vais traiter:
Le logiciel a pour objectif de déterminer où et comment les pics sont importants. Nous utilisons un logiciel propriétaire pour comprendre cela maintenant, mais nous voulons écrire notre propre programme d'analyse (en R) afin de savoir ce qui se passe sous les feuilles. Comme vous pouvez le constater, la grande majorité des données ne sont pas intéressantes, mais nous ne voulons pas rejeter les données potentiellement utiles que notre algorithme a manquées. Une fois que nous aurons une liste de pics probables dont nous serons satisfaits, le reste du pipeline utilisera cette liste de pics plutôt que la liste brute de points de données. Je suppose qu'il suffirait de stocker les points de données bruts sous forme de gros blob pour pouvoir les ré-analyser au besoin, mais ne conserver que les pics sous forme d'entrées de base de données distinctes. Dans ce cas, il y aurait seulement une vingtaine de pics par spectre, donc les trucs délirants de la mise à l'échelle ne devraient pas