SQL (ite) быстрый поиск нескольких подстрок большей строки (генома) - PullRequest
3 голосов
/ 06 января 2020

У меня есть база данных sql, состоящая из генома, его хромосом и " интересных " областей (в формате BED). Геном (например, 4 ГБ) состоит из +/- 20 хромосом, поэтому каждая строка имеет размер около 200 МБ. Например, хромосома в геноме состоит из строки:

NNNNATCCAGGAGAATTACAT...ACCGGGAATTCCCGGNNNNN # 200 MB large

Допустим, у меня есть около 1.000.000 областей пиков ATA C -seq, и я хотел бы получить только последовательности из 100 п.н. хромосома 3. Мой запрос SQL будет выглядеть следующим образом:

SELECT substr(Chr.Sequence, Bed.ChromStart + Bed.Peak - 50, 100) FROM Bed Bed
INNER JOIN Chromosome Chr ON Bed.ChromosomeId = Chr.ChromosomeId
WHERE Chr.Chromosome = 'chr3'

Проблема с такого рода поисками заключается в том, что Chr.Sequence загружается для каждого отдельного удара, что делает использование оперативной памяти чрезмерно большим, и поиск действительно медленный. Я «исправил» это, используя только базу данных SQL для хранения позиций интересных мест, а затем используя pyfaidx, чтобы быстро получить соответствующие последовательности из хромосомы.

Мне интересно, возможен ли быстрый поиск в SQL (ите), поскольку текущее решение кажется мне немного случайным c.

1 Ответ

2 голосов
/ 15 января 2020

Вы можете разбить строку генома на части и одновременно искать подстроки, используя многопроцессорность, чтобы минимизировать использование одного процессора и ускорить результаты.

import sys
import multiprocessing
from multiprocessing import Pool

def SplitGenomeString(start,length):
#where con in sqlconnection to database using as global variable
   cursorObj = con.cursor()


   cursorObj.execute('SELECT substr(Chr.Sequence,{},{}) FROM Chromosome 
                      Chr'.format(str(start),str(length))
   return cursorObj.fetchall()

def getSubSequence(s):
#Write your Queries according to your requirements for finding subsequence s




if __name__ == '__main__':
    length = SplitGenomeString(0,sys.maxint)
    cores = multiprocessing.cpu_count()

    #asumming the subsequence you want to check is 100
    subseq_len = 100

    for i in range(0,length,round(length/cores)):
        ls.append(SplitGenomeString(i,round(length/cores)))

    #this will also include the excluded parts because of splitting geneome string
    temp = []
    for i in range(len(ls) - 1):
        temp.append(ls[i][1 - subseq_len):] + ls[i+1][:subseq_len - 1])

    ls = ls + temp

    with Pool(cores) as p:
        p.map(getSubSequence,ls)

О многопроцессорности можно узнать по этой ссылке: https://docs.python.org/3/library/multiprocessing.html

Отредактировано как сказано

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...