Saya berencana menyimpan pindaian dari spektrometer massa dalam database MySQL dan ingin mengetahui apakah menyimpan dan menganalisis jumlah data ini layak atau tidak. Saya tahu kinerja sangat bervariasi tergantung pada lingkungan, tetapi saya mencari urutan besarnya: apakah permintaan akan memakan waktu 5 hari atau 5 milidetik?
Masukkan format
Setiap file input berisi proses spektrometer tunggal; setiap proses terdiri dari satu set pemindaian, dan setiap pemindaian memiliki larik titik data yang dipesan. Ada sedikit metadata, tetapi sebagian besar file terdiri dari array 32 atau 64 bit atau mengapung.
Sistem host
| ---------------- + ------------------------------- | | OS | Windows 2008 64-bit | | Versi MySQL | 5.5.24 (x86_64) | | CPU | 2x Xeon E5420 (total 8 core) | | RAM | 8GB | | Sistem file SSD | 500 GiB | | HDD RAID | 12 TiB | | ---------------- + ------------------------------- |
Ada beberapa layanan lain yang berjalan di server menggunakan waktu prosesor yang dapat diabaikan.
Statistik file
| ------------------ + -------------- | | jumlah file | ~ 16.000 | | ukuran total | 1.3 TiB | | ukuran min | 0 byte | | ukuran maksimal | 12 GiB | | berarti | 800 MiB | | median | 500 MiB | | total titik data | ~ 200 miliar | | ------------------ + -------------- |
Jumlah total titik data adalah perkiraan yang sangat kasar.
Skema yang diajukan
Saya berencana melakukan hal-hal "benar" (yaitu menormalkan data seperti orang gila) dan akan memiliki runs
tabel, spectra
tabel dengan kunci asing runs
, dan datapoints
tabel dengan kunci asing spectra
.
Dataran data 200 miliar pertanyaan
Saya akan menganalisis berbagai spektrum dan bahkan mungkin beberapa berjalan, menghasilkan pertanyaan yang bisa menyentuh jutaan baris. Dengan asumsi saya mengindeks semuanya dengan benar (yang merupakan topik untuk pertanyaan lain) dan saya tidak berusaha mengocok ratusan MiB di seluruh jaringan, apakah masuk akal jika MySQL menangani hal ini?
informasi tambahan
Data pemindaian akan berasal dari file dalam format mzML berbasis
XML . Daging format ini ada di
<binaryDataArrayList>
elemen tempat data disimpan. Setiap pemindaian menghasilkan> = 2 <binaryDataArray>
elemen yang, secara bersamaan, membentuk larik 2 dimensi (atau lebih) [[123.456, 234.567, ...], ...]
.
Data-data ini ditulis sekali, jadi perbarui kinerja dan keamanan transaksi bukan masalah.
Rencana naif saya untuk skema database adalah:
runs
meja
| nama kolom | ketik | | ------------- + ------------- | | id | KUNCI UTAMA | | start_time | TIMESTAMP | | nama | VARCHAR | | ------------- + ------------- |
spectra
meja
| nama kolom | ketik | | ---------------- + ------------- | | id | KUNCI UTAMA | | nama | VARCHAR | | indeks | INT | | spectrum_type | INT | | representasi | INT | | run_id | KUNCI ASING | | ---------------- + ------------- |
datapoints
meja
| nama kolom | ketik | | ------------- + ------------- | | id | KUNCI UTAMA | | spectrum_id | KUNCI ASING | | mz | GANDA | | num_counts | GANDA | | indeks | INT | | ------------- + ------------- |
Apakah ini masuk akal?
Jadi, karena Anda mungkin dapat menyimpulkan, saya adalah programmer, bukan ahli biologi di lab, jadi saya tidak tahu sains hampir sama baiknya dengan ilmuwan yang sebenarnya.
Berikut adalah plot spektrum tunggal (pemindaian) dari jenis data yang akan saya hadapi:
Tujuan dari perangkat lunak ini adalah untuk mencari tahu di mana dan seberapa signifikan puncaknya. Kami menggunakan paket perangkat lunak berpemilik untuk mencari tahu ini sekarang, tetapi kami ingin menulis program analisis kami sendiri (dalam R) sehingga kami tahu apa yang sedang terjadi di bawah lembaran. Seperti yang Anda lihat, sebagian besar data tidak menarik, tetapi kami tidak ingin membuang data yang berpotensi bermanfaat yang terlewatkan oleh algoritma kami. Setelah kami memiliki daftar kemungkinan puncak dengan mana kami puas, sisa pipa akan menggunakan daftar puncak itu daripada daftar mentah titik data. Saya kira itu akan cukup untuk menyimpan datapoints mentah sebagai gumpalan besar, sehingga mereka dapat dianalisis kembali jika perlu, tetapi hanya menyimpan puncak sebagai entri database yang berbeda. Dalam hal ini, hanya akan ada beberapa lusin puncak per spektrum, jadi hal-hal skala gila tidak boleh