Я планую зберігати скани з мас-спектрометра в базі даних MySQL і хотів би дізнатися, чи можливо зберігання та аналіз цієї кількості даних віддалено. Я знаю, продуктивність різко змінюється залежно від середовища, але я шукаю приблизний порядок: чи запити займуть 5 днів або 5 мілісекунд?
Формат введення
Кожен вхідний файл містить один пробіг спектрометра; кожен запуск складається з набору сканів, і кожне сканування має впорядкований масив точок даних. Існує небагато метаданих, але більшість файлів складаються з масивів 32- або 64-бітних ints або floats.
Система господарів
| ---------------- + ------------------------------- | | ОС | 64-розрядна версія Windows 2008 | | Версія MySQL | 5.5.24 (x86_64) | | ЦП | 2x Xeon E5420 (всього 8 ядер) | | ОЗУ | 8 Гб | | Файлова система SSD | 500 ГіБ | | HDD RAID | 12 TiB | | ---------------- + ------------------------------- |
На сервері працюють деякі інші сервіси, використовуючи незначний час процесора.
Статистика файлів
| ------------------ + -------------- | | кількість файлів | ~ 16 000 | | загальний розмір | 1.3 TiB | | хв. розмір | 0 байт | | максимальний розмір | 12 ГіБ | | означають | 800 МіБ | | медіана | 500 МіБ | | загальних точок даних | ~ 200 млрд. | | ------------------ + -------------- |
Загальна кількість точок даних - це дуже приблизна оцінка.
Запропонована схема
Я планую робити «правильно» (тобто нормалізувати дані, як божевільні), і тому я мав би runs
таблицю, spectra
таблицю з іноземним ключем до runs
та datapoints
таблицю із зовнішнім ключем до spectra
.
Питання щодо точки 200 мільярдів
Я буду аналізувати різні спектри та, можливо, навіть декілька прогонів, в результаті чого запити можуть торкнутися мільйонів рядків. Якщо припустити, що я індексую все належним чином (що є темою для іншого питання), і я не намагаюся перемішувати сотні MiB по всій мережі, чи віддалено правдоподібно для MySQL це впоратися?
додаткова інформація
Дані сканування надходять з файлів у форматі mzML на основі
XML . М’ясо цього формату знаходиться в
<binaryDataArrayList>
елементах, де зберігаються дані. Кожне сканування створює> = 2 <binaryDataArray>
елементи, які разом узяті утворюють двовимірний (або більше) масив форми [[123.456, 234.567, ...], ...]
.
Ці дані записуються одноразово, тому ефективність оновлення та безпека транзакцій не викликають занепокоєння.
Мій наївний план схеми бази даних:
runs
стіл
| назва стовпця | тип | | ------------- + ------------- | | id | ПЕРШИЙ КЛЮЧ | | start_time | TIMESTAMP | | назва | ВАРЧАР | | ------------- + ------------- |
spectra
стіл
| назва стовпця | тип | | ---------------- + ------------- | | id | ПЕРШИЙ КЛЮЧ | | назва | ВАРЧАР | | індекс | INT | | спектр_типу | INT | | представництво | INT | | run_id | ІНТЕРНЕТ КЛЮЧ | | ---------------- + ------------- |
datapoints
стіл
| назва стовпця | тип | | ------------- + ------------- | | id | ПЕРШИЙ КЛЮЧ | | спектр_id | ІНТЕРНЕТ КЛЮЧ | | мз | ДВОЙНИЙ | | num_counts | ДВОЙНИЙ | | індекс | INT | | ------------- + ------------- |
Це розумно?
Отже, як ви, можливо, змогли зробити висновок, я програміст, а не біолог у лабораторії, тому я майже не знаю науки, як фактичних вчених.
Ось сюжет єдиного спектру (сканування) такого роду даних, з яким я буду мати справу:
Мета програмного забезпечення - з'ясувати, де і наскільки значущі піки. Ми використовуємо фірмовий програмний пакет, щоб розібратися в цьому зараз, але ми хочемо написати власну програму аналізу (в R), щоб ми знали, що, до біса, відбувається під аркушами. Як бачимо, переважна більшість даних є нецікавими, але ми не хочемо викидати потенційно корисні дані, пропущені нашим алгоритмом. Після того, як у нас з’явиться список можливих піків, якими ми задоволені, решта конвеєра використовуватиме цей піковий список, а не необроблений список точок даних. Я припускаю, що досить було б зберігати необроблені точки даних як велику крапку, щоб їх можна було повторно аналізувати, якщо потрібно, але зберігати лише піки як окремі записи бази даних. У такому випадку було б лише пару десятків піків на спектр, тож шалене масштабування не повинно бути '