Разработка эффективного инструмента для запроса и сравнения # n-запросов - PullRequest
0 голосов
/ 21 мая 2019

Я настраиваю инструмент, который сравнивает образцы.Каждый образец имеет 55 000 «генов» (биология не важна).Я выполняю первоначальный запрос для образцов, которые соответствуют «типу ткани», затем я хочу знать, какие гены в этом наборе имеют логическое значение True> 95%.Я делаю это с помощью приложения Flask и таблиц базы данных SQLAlchemy.Вот мои модели и текущий алгоритм.Когда число выборок равно n = 2, функция работает нормально, но когда выборки n> 10., процесс завершается сбоем.

В таблице образцов хранится имя образца, некоторая неважная информация и связь свсе «гены» для этого образца.Таблица генов просто хранит название гена и логическое значение.Все образцы имеют одинаковые 55 000 генов, а таблица GeneQual содержит все 55 000 генов с информацией о них.

Models.py:

class Sample(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    SRR_id = db.Column(db.String(10), index=True, unique=True)
    GSM_acc = db.Column(db.String(10))
    experiment_id = db.Column(db.String(10))
    tissue = db.Column(db.String(64))
    cell_type = db.Column(db.String(64))
    genes = db.relationship('Gene', backref='name', lazy='dynamic')
    def __repr__(self):
        return '<SRR_id {}>'.format(self.SRR_id)

class Gene(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    gene_id = db.Column(db.String(20), index=True)
    barcode = db.Column(db.Boolean)
    sample_id = db.Column(db.Integer, db.ForeignKey('sample.id'))
    def __repr__(self):
        return '<Gene_id {}>'.format(self.gene_id)

class GeneQual(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    gene_id = db.Column(db.String(20), index=True)
    symbol = db.Column(db.String(32))
    name = db.Column(db.String(32))
    location = db.Column(db.String(64))

функция:

samples = Sample.query.filter_by(tissues=tissue_type).all()
for i in range(len(samples)):
    samples[i] = samples[i].genes

results = []
for item in zip(*samples):
    sums = 0
    for i in range(len(item)):
        if item[i].barcode:
            sums += 1
    if sums >= (len(item)*0.95):
        results.append(item[0].gene_id)

Я открыт для любой и любой критики, как по настройке базы данных, так и по функции.Он может использовать некоторую оптимизацию для работы, когда n-выборок больше.

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