Могу ли я ускорить обработку запросов к базе данных SQLite, превышающей 600 миллионов строк?Python

Программы на Python
Anonymous
Могу ли я ускорить обработку запросов к базе данных SQLite, превышающей 600 миллионов строк?

Сообщение Anonymous »

Я создал локальную базу данных, содержащую около 600 миллионов записей, которые я хочу эффективно запрашивать (сначала я попробовал панды, но это слишком медленно). Это локальный dbSNP, который содержит только rsID и геномные позиции для тех, кто заинтересован. Для этого я использовал этот код:

Код: Выделить всё

import sqlite3
import gzip
import csv

rsid_db = sqlite3.connect('rsid.db')

rsid_cursor = rsid_db.cursor()

rsid_cursor.execute(
"""
CREATE TABLE rsids (
rsid TEXT,
chrom TEXT,
pos INTEGER,
ref TEXT,
alt TEXT
)
"""
)

with gzip.open('00-All.vcf.gz', 'rt') as vcf: # from https://ftp.ncbi.nih.gov/snp/organisms/human_9606/VCF/00-All.vcf.gz
reader = csv.reader(vcf, delimiter="\t")
i = 0
for row in reader:
if not ''.join(row).startswith('#'):
rsid_cursor.execute(
f"""
INSERT INTO rsids (rsid, chrom, pos, ref, alt)
VALUES ('{row[2]}', '{row[0]}', '{row[1]}', '{row[3]}', '{row[4]}');
"""
)
i += 1
if i % 1000000 == 0:
print(f'{i} entries written')
rsid_db.commit()

rsid_db.commit()

rsid_db.close()
Все, что я хочу сделать с этой базой данных, — это запросить несколько rsID и получить их геномное положение и изменение (запрос rsid и получение chrom, pos) , ref, alt, а также rsid). Одна запись выглядит так:

Код: Выделить всё

   rsid     chrom   pos   ref  alt
rs537152180   1   4002401  G   A,C
В настоящее время я запрашиваю его с помощью этой функции:

Код: Выделить всё

import sqlite3
import pandas as pd

def query_rsid(rsid_list,
rsid_db_path='rsid.db'):

with sqlite3.connect(rsid_db_path) as rsid_db:

rsid_cursor = rsid_db.cursor()
rsid_cursor.execute(
f"""
SELECT * FROM rsids
WHERE rsid IN ('{"', '".join(rsid_list)}');
"""
)

query = rsid_cursor.fetchall()

return query
Опрос занимает около 1,5 минут, независимо от количества записей. Есть ли способ ускорить это с помощью SQLite или это просто ограничено моей машиной?

Подробнее здесь: https://stackoverflow.com/questions/790 ... e-datebase

Вернуться в «Python»