Urutan Biologis dari UniProt di PostgreSQL

11

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;
Aleksandr Levchuk
sumber
Pola akses data seperti apa yang akan Anda miliki? Akankah data DNA dan protein diakses secara bersamaan untuk suatu urutan? Apakah Anda perlu mencari dalam urutan? Apakah akses data sebagian besar untuk baris tunggal pada satu waktu atau apakah Anda akan melakukan pemindaian data? Cara Anda mengakses data, dalam banyak hal, jauh lebih penting daripada data itu sendiri.
Jeremiah Peschka
1
Bukan untuk mencegah Anda berkonsultasi dengan komunitas pemula ini, tetapi untuk pertanyaan bioinformatika, biostar.stackexchange.com mungkin memiliki jawaban yang Anda cari. Semoga itu bisa membantu!
Gaurav
+1 untuk Biostar, tapi saya tetap menjalankan DB ini dengan ketat.
Aleksandr Levchuk
@ jcolebrand, ini terkait dengan Blast. Kami memiliki fungsi ekspor yang menuliskan urutan ke format FASTA dan itu adalah input yang valid ke Blast. Kemudian Blast dapat melakukan pencarian kesamaan throughput tinggi terhadap sekuens atau terhadap database yang lebih besar (tetapi hanya Uniprot yang bisa lebih besar daripada Uniport). Kami juga membangun HMM dari rangkaian sekuens dan menggunakan HMMER2 untuk mencari kesamaan.
Aleksandr Levchuk

Jawaban:

7

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 texttipe data.

Menurut dokumentasi :

String panjang dikompresi oleh sistem secara otomatis, sehingga persyaratan fisik pada disk mungkin kurang. Nilai yang sangat panjang juga disimpan dalam tabel latar belakang sehingga tidak mengganggu akses cepat ke nilai kolom yang lebih pendek. Bagaimanapun, string karakter terpanjang yang dapat disimpan adalah sekitar 1 GB.

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:

Fitur urutan sesuai dengan triplet (id, orient, ii) di mana id adalah pengidentifikasi urutan (mungkin kunci utama untuk tabel urutan), orient adalah boolean yang menunjukkan apakah fitur tersebut dalam orientasi urutan yang sama atau berlawanan, dan ii adalah int_interval yang mewakili fitur sebagai urutan.

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.

Brian Ballsun-Stanton
sumber
1

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.

Chris Travers
sumber