【问题标题】:Data set query, database or searching in file?数据集查询、数据库还是在文件中搜索?
【发布时间】:2019-05-12 19:40:22
【问题描述】:

我有一组文件,大约 300 个文件,每个文件有 50,000 行。每行都是一个带有二进制值(1 或 0)的字符串标签。所有文件都有相同的条目,但二进制值不同。下面的文件示例。

Tag1    0
Tag2    1
...
Tag50000    0

我打算构建一个 Python Flask Web 工具,它具有多个函数,可以比较两个“文件”或查找每个“文件”的特定标记为 1。另一种选择是搜索目录中的所有文件以进行比较。我相信使用一些 SQL 数据库进行查询会非常强大,但是我有一些问题。这就是我想象的数据库的结构方式,但我可能错了。

Filename1   Tag1-value  Tag2-value  ... Tag50000-value
Filename2   Tag1-value  Tag2-value  ... Tag50000-value
...
Filename300 Tag1-value  Tag2-value  ... Tag50000-value

我对 Flask 的 SQLAlchemy 有一些经验,但从我以前的使用来看,每个数据库值都需要在我的应用程序的模型文件中单独声明,这对于 50,000 个特征似乎非常低效。是否可以将所有这些数据输入到不同的 SQL 数据库中并仍然在烧瓶中访问它?

这是我认为必须设置模型的方式,如果有必要,我会写出所有 50,000 个标签,但我必须相信有更简单的方法可以做到这一点。

class Dataset(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    filename = db.Column(db.String(64), index=True, unique=True)

    tag1 = db.Column(db.Boolean)    # or tag1 = db.Column(db.Integer)
    tag2 = db.Column(db.Boolean)    # or tag2 = db.Column(db.Integer)
    # ...
    tag50000 = db.Column(db.Boolean)    # or tag50000 = db.Column(db.Integer)

【问题讨论】:

  • 你能澄清一下吗...每个数据库值都需要在我的应用程序的模型文件中单独声明,这对于 50,000 个特征似乎非常低效 ...是否有 50000 个标签?标签是字符串还是其他东西?模型肯定是标记、验证、文件...1 定义
  • 不能是 id、file、tagName、val 吗?使其达到 15,000,000 行
  • @AndrewAllen 谢谢我更新了我的问题以包含代码 sn-p。有 300 个文件,每个文件都有相同的 50,000 个字符串标签,但是每个标签的值可以是 1 或 0。这是我学习 SQLAlchemy 的格式。我想可能是这样,我可以试一试。不确定运行时间会受到怎样的影响,但我会试一试。
  • 表中有 50000 列,每个标签一列,是不现实的。 Oracle 允许每个表有 1000 列,MySql 允许 4096,其他数据库有类似的限制。您需要一个不同的模型 - 一个包含 3 列的表格:FileId, TagName, Value(0/1)
  • @krokodilko 谢谢你的帮助,这就是我最终实现的。我不确定列数的限制。

标签: python sql database flask


【解决方案1】:

这是我目前的工作解决方案,不优雅,可能有更好的优化方式。两个表,第一个用于每个“文件名”,第二个用于每个标签。

表 1:

FileId  ReferencetoTag

表 2:

TagId   Value(0/1)  FileId(ForeignKey)
class Sample(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    # Sample_id and filename are synonymous
    Sample_id = db.Column(db.String(10), index=True, unique=True)
    tags = db.relationship('Tag', backref='name', lazy='dynamic')

    def __repr__(self):
        return '<File_id {}>'.format(self.File_id)


class Tag(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    tag_id = db.Column(db.String(20), index=True)

    value = db.Column(db.Boolean)
    sample_id = db.Column(db.Integer, db.ForeignKey('sample.id'))

    def __repr__(self):
        return '<Gene_id {}>'.format(self.gene_id)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-04
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 2015-03-25
    • 2020-07-25
    • 1970-01-01
    相关资源
    最近更新 更多