Planuję przechowywać skany ze spektrometru masowego w bazie danych MySQL i chciałbym wiedzieć, czy przechowywanie i analiza tej ilości danych jest zdalnie możliwa. Wiem, że wydajność różni się bardzo w zależności od środowiska, ale szukam przybliżonego rzędu wielkości: czy zapytania potrwają 5 dni, czy 5 milisekund?
Format wejściowy
Każdy plik wejściowy zawiera jeden przebieg spektrometru; każdy przebieg składa się z zestawu skanów, a każdy skan ma uporządkowaną tablicę punktów danych. Jest trochę metadanych, ale większość pliku składa się z tablic 32- lub 64-bitowych liczb całkowitych lub zmiennoprzecinkowych.
System hosta
| ---------------- + ------------------------------- | | OS | Windows 2008 64-bit | | Wersja MySQL | 5.5.24 (x86_64) | | CPU | 2x Xeon E5420 (łącznie 8 rdzeni) | | RAM | 8 GB | | System plików SSD | 500 GiB | | HDD RAID | 12 TiB | | ---------------- + ------------------------------- |
Istnieje kilka innych usług działających na serwerze, które wykorzystują znikomy czas procesora.
Statystyki plików
| ------------------ + -------------- | | liczba plików | ~ 16 000 | | całkowity rozmiar | 1,3 TiB | | minimalny rozmiar | 0 bajtów | | maksymalny rozmiar | 12 GiB | | znaczy | 800 MiB | | mediana | 500 MiB | | ogółem punktów danych | ~ 200 miliardów | | ------------------ + -------------- |
Całkowita liczba punktów danych jest bardzo przybliżona.
Proponowany schemat
Planuję robić rzeczy „dobrze” (tj. Normalizować dane jak szalone), a więc miałbym runs
tabelę, spectra
tabelę z kluczem obcym do runs
i datapoints
tabelę z kluczem obcym do spectra
.
Pytanie o 200 miliardów punktów danych
Zamierzam analizować wiele widm, a może nawet wiele przebiegów, co spowoduje zapytania, które mogą dotknąć milionów wierszy. Zakładając, że indeksuję wszystko poprawnie (co jest tematem na inne pytanie) i nie próbuję przetasować setek MiB w sieci, czy zdalnie jest możliwe, aby MySQL sobie z tym poradził?
dodatkowe informacje
Dane skanowania będą pochodzić z plików w formacie mzML opartym na XML
. Mięso tego formatu znajduje się w
<binaryDataArrayList>
elementach, w których przechowywane są dane. Każde skanowanie tworzy> = 2 <binaryDataArray>
elementy, które razem tworzą dwuwymiarową (lub więcej) tablicę formy [[123.456, 234.567, ...], ...]
.
Dane te są zapisywane jednokrotnie, więc wydajność aktualizacji i bezpieczeństwo transakcji nie stanowią problemu.
Mój naiwny plan dotyczący schematu bazy danych to:
runs
stół
| nazwa kolumny | typ | | ------------- + ------------- | | id | KLUCZ PODSTAWOWY | | czas_początkowy | TIMESTAMP | | nazwa | VARCHAR | | ------------- + ------------- |
spectra
stół
| nazwa kolumny | typ | | ---------------- + ------------- | | id | KLUCZ PODSTAWOWY | | nazwa | VARCHAR | | indeks | INT | | typ_ widma | INT | | reprezentacja | INT | | run_id | KLUCZ ZAGRANICZNY | | ---------------- + ------------- |
datapoints
stół
| nazwa kolumny | typ | | ------------- + ------------- | | id | KLUCZ PODSTAWOWY | | widmo_id | KLUCZ ZAGRANICZNY | | mz | DOUBLE | | liczba_liczb | DOUBLE | | indeks | INT | | ------------- + ------------- |
Czy to rozsądne?
Tak więc, jak być może potrafiłeś wnioskować, jestem programistą, a nie biologiem w laboratorium, więc nie znam wiedzy tak dobrze, jak faktyczni naukowcy.
Oto wykres pojedynczego spektrum (skanu) rodzaju danych, z którymi będę miał do czynienia:
Celem oprogramowania jest ustalenie, gdzie i jak znaczące są szczyty. Używamy zastrzeżonego pakietu oprogramowania, aby to rozgryźć, ale chcemy napisać własny program analityczny (w języku R), abyśmy wiedzieli, co się dzieje pod kartami. Jak widać, ogromna większość danych jest nieciekawa, ale nie chcemy wyrzucać potencjalnie użytecznych danych, które przeoczył nasz algorytm. Kiedy już będziemy mieć listę prawdopodobnych pików, z których jesteśmy zadowoleni, reszta potoku użyje tej listy pików zamiast surowej listy punktów danych. Przypuszczam, że wystarczyłoby przechowywanie nieprzetworzonych punktów danych jako dużego obiektu blob, aby w razie potrzeby można je ponownie przeanalizować, ale zachowując tylko piki jako odrębne wpisy bazy danych. W takim przypadku byłoby tylko kilkadziesiąt pików na widmo, więc szalone skalowanie nie powinno