gpt4 book ai didi

python - SQL(ite)快速检索较大字符串(基因组)的多个子字符串

转载 作者:行者123 更新时间:2023-12-02 08:21:58 24 4
gpt4 key购买 nike

我有一个 sql 数据库,其中包含基因组、染色体和“有趣”区域(BED 格式)。基因组(例如 4GB)由 +/- 20 条染色体组成,因此每个字符串大约有 200MB 大。例如,基因组中的染色体由字符串组成:

NNNNATCCAGGAGAATTACAT...ACCGGGAATTCCCGGNNNNN # 200 MB large

假设我有大约 1.000.000 个区域 ATAC-seq 峰值,我想获取仅 3 号染色体的 100 bp 的序列。我的 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(ite) 中是否可以进行快速查找,因为当前的解决方案对我来说有点特殊。

最佳答案

您可以将基因组字符串分成多个部分,并使用多处理同时搜索子字符串,以最大程度地减少单个处理器的使用并更快地获得结果。

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

已按告知进行编辑

关于python - SQL(ite)快速检索较大字符串(基因组)的多个子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59609641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com