Apa cara terbaik untuk menyimpan urutan biologis UniProt di PostreSQL?
Detail Data
- Kami menarik 12 juta sekuens dari UniProt - jumlah ini kemungkinan akan berlipat ganda setiap 3-10 bulan.
- Panjang urutan dapat bervariasi dari 10 hingga 50 miliar karakter
- Kurang dari 1% dari urutan lebih panjang dari 10 ribu karakter
- Apakah akan meningkatkan kinerja untuk menyimpan urutan yang lebih lama secara terpisah?
- Urutan dapat berupa Protein atau alfabet DNA
- Alfabet DNA memiliki 5 karakter (A, T, C, G, atau -).
- Alfabet Protein akan memiliki sekitar 30 karakter.
- Kami tidak keberatan menyimpan urutan dua huruf yang berbeda di kolom yang berbeda atau bahkan tabel yang berbeda. Apakah itu membantu?
Detail Akses Data
Untuk menjawab komentar Jeremiah Peschka:
- Urutan protein dan DNA akan diakses pada waktu yang berbeda
- Tidak perlu mencari dalam urutan (yang dilakukan di luar db)
- Apakah akan mengakses baris tunggal pada satu waktu atau menarik set baris dengan ID. Kami tidak perlu memindai baris. Semua urutan dirujuk oleh tabel lain - beberapa hierarki bermakna secara biologis dan kronologis ada di database.
Kompatibilitas Mundur
Alangkah baiknya untuk dapat terus dapat menerapkan fungsi hashing berikut (SEGUID - SEquence Globally Unique IDentifier) ke urutan.
CREATE OR REPLACE FUNCTION gfam.get_seguid(p_sequence character varying)
RETURNS character varying AS
$BODY$
declare
result varchar := null;
x integer;
begin
select encode(gfam.digest(p_sequence, 'sha1'), 'base64')
into result;
x := length(result);
if substring(result from x for 1) = '=' then
result := substring( result from 1 for x-1 );
end if;
return result;
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
postgresql
Aleksandr Levchuk
sumber
sumber
Jawaban:
Menjelajahi fungsi-fungsi di PostBio sepertinya mereka memiliki beberapa cara penyandian. Namun, mengingat bahwa ekstensi tersebut dioptimalkan untuk pencarian, mereka membuat banyak referensi untuk hanya menggunakan
text
tipe data.Menurut dokumentasi :
Oleh karena itu, dengan menempatkan tabel ke tablespace sendiri yang sangat besar pada perangkat keras khusus harus cukup untuk tujuan kinerja Anda. Jika 1 GB terlalu kecil untuk data Anda, int_interval dari ProtBio harus memberikan kinerja yang sangat baik:
Pengkodean urutan di sha1 terlihat menjadi cara yang sangat menyakitkan untuk membuat GUID, mengingat panjang potensial dari urutan.
Jika urutan yang berbeda tidak terkait, simpan di ruang tablespace yang berbeda pada disk yang berbeda untuk kinerja maksimum.
sumber
Saya pikir 50 miliar karakter kemungkinan akan mendorong batas apa yang dapat Anda lakukan dengan PostgreSQL tanpa membagi catatan Anda dengan beberapa cara. Saya kira Anda harus menemukan cara untuk memecah hal-hal dengan cara tertentu. Saya tidak tahu seperti apa penyandian postbio yang memungkinkan tetapi ....
Perhitungan cepat di sini: 5 karakter memerlukan 3 bit untuk disandikan, tetapi 4 bit akan membuat pencarian lebih mudah karena dua karakter dapat disandikan per byte. Di sisi lain 3 mungkin cukup jika Anda mencari grup dengan 10 huruf atau lebih karena Anda dapat melakukan 10 karakter per 4 byte. Jadi dioptimalkan untuk pencarian string pendek, 50 miliar karakter membutuhkan sekitar 25gb penyimpanan, jauh melampaui apa yang dapat Anda lakukan dalam satu kolom. Kompresi mungkin membantu, tapi itu skala kompresi besar yang diperlukan di luar representasi biner minimal terkompresiuntuk turun ke 1GB. Dioptimalkan untuk pencarian yang lebih lama, kami hanya mendapatkan 20GB. jadi saya pikir bahkan jika Anda memiliki tipe informasi genetik, Anda akan memecahnya. Protein pada kompleksitas itu akan lebih menjadi tantangan karena yang terbaik yang dapat Anda harapkan adalah notasi 5 bit yang berarti Anda memiliki 6 per 32, yang berarti wadah penyimpanan Anda yang terbaik adalah 30GB per kolom. Jadi, kecuali Anda bisa mendapatkan Kompresi lagi dapat membantu tetapi itu tingkat kompresi besar diperlukan. Saya telah melihat tingkat kompresi yang baik, tetapi perlu diingat Anda mungkin mendorongnya.
Jadi rekomendasi saya menyadari masalah ini, dan melakukan beberapa pengujian dengan data nyata. Bersiaplah untuk menguraikan pembacaan Anda dalam beberapa kasus.
sumber