Я планирую хранить сканы с масс-спектрометра в базе данных MySQL и хотел бы знать, возможно ли удаленное хранение и анализ этого количества данных. Я знаю, что производительность сильно варьируется в зависимости от среды, но я ищу приблизительный порядок: запросы будут занимать 5 дней или 5 миллисекунд?
Формат ввода
Каждый входной файл содержит один прогон спектрометра; каждый прогон состоит из набора сканов, и у каждого скана есть упорядоченный массив точек данных. Существует немного метаданных, но большая часть файла состоит из 32- или 64-битных массивов или чисел с плавающей запятой.
Хост-система
| ---------------- + ------------------------------- | | ОС | Windows 2008 64-разрядная | | Версия MySQL | 5.5.24 (x86_64) | | Процессор | 2x Xeon E5420 (всего 8 ядер) | | RAM | 8 Гб | | Файловая система SSD | 500 ГиБ | | HDD RAID | 12 TiB | | ---------------- + ------------------------------- |
На сервере работают некоторые другие службы, использующие незначительное время процессора.
Файловая статистика
| ------------------ + -------------- | | количество файлов | ~ 16 000 | | общий размер | 1,3 TiB | | минимальный размер | 0 байт | | максимальный размер | 12 ГиБ | | значит | 800 МиБ | | средний | 500 МиБ | | общее количество данных | ~ 200 миллиардов | | ------------------ + -------------- |
Общее количество точек данных является очень приблизительной оценкой.
Предлагаемая схема
Я планирую делать вещи "правильно" (то есть нормализовать данные как сумасшедшие) и поэтому буду иметь runs
таблицу, spectra
таблицу с внешним ключом runs
и datapoints
таблицу с внешним ключом для spectra
.
Вопрос о 200-миллиардном назначении данных
Я собираюсь проанализировать несколько спектров и, возможно, даже несколько прогонов, что приведет к запросам, которые могут касаться миллионов строк. Предполагая, что я все правильно проиндексировал (что является темой для другого вопроса) и не пытаюсь перетасовать сотни МБ по сети, возможно ли удаленное управление MySQL для этого?
Дополнительная информация
Данные сканирования будут поступать из файлов в формате mzML на основе
XML . Мясо этого формата находится в
<binaryDataArrayList>
элементах, где хранятся данные. Каждое сканирование создает> = 2 <binaryDataArray>
элемента, которые вместе взятые образуют двумерный (или более) массив формы [[123.456, 234.567, ...], ...]
.
Эти данные предназначены для однократной записи, поэтому производительность обновления и безопасность транзакций не имеют значения.
Мой наивный план для схемы базы данных:
runs
Таблица
| имя столбца | тип | | ------------- + ------------- | | id | ПЕРВИЧНЫЙ КЛЮЧ | | время начала | TIMESTAMP | | имя | VARCHAR | | ------------- + ------------- |
spectra
Таблица
| имя столбца | тип | | ---------------- + ------------- | | id | ПЕРВИЧНЫЙ КЛЮЧ | | имя | VARCHAR | | индекс | INT | | тип_спектра | INT | | представительство | INT | | run_id | ИНОСТРАННЫЙ КЛЮЧ | | ---------------- + ------------- |
datapoints
Таблица
| имя столбца | тип | | ------------- + ------------- | | id | ПЕРВИЧНЫЙ КЛЮЧ | | spectrum_id | ИНОСТРАННЫЙ КЛЮЧ | | мз | ДВОЙНОЙ | | num_counts | ДВОЙНОЙ | | индекс | INT | | ------------- + ------------- |
Это разумно?
Итак, как вы, возможно, смогли сделать вывод, я программист, а не биолог в лаборатории, поэтому я не знаю науку почти так же хорошо, как настоящие ученые.
Вот график одного спектра (сканирования) того типа данных, с которыми я буду иметь дело:
Цель программного обеспечения - выяснить, где и насколько значительны пики. Мы используем пакет проприетарного программного обеспечения, чтобы понять это сейчас, но мы хотим написать нашу собственную программу анализа (на R), чтобы мы знали, что, черт возьми, происходит под листами. Как видите, подавляющее большинство данных неинтересны, но мы не хотим выбрасывать потенциально полезные данные, которые пропустил наш алгоритм. Как только у нас будет список возможных пиков, которыми мы удовлетворены, остальная часть конвейера будет использовать этот пиковый список, а не необработанный список точек данных. Я полагаю, что было бы достаточно сохранить необработанные точки данных в виде большого двоичного объекта, чтобы при необходимости их можно было повторно проанализировать, но сохранить только пики в качестве отдельных записей базы данных. В этом случае будет только пара дюжин пиков в спектре, так что безумное масштабирование не должно