【问题标题】:Storing a large matrix in postgresql and manipulating it in python在 postgresql 中存储一个大矩阵并在 python 中操作它
【发布时间】:2020-04-18 02:15:33
【问题描述】:

我有一个大矩阵,目前存储在特定表中。
每个矩阵行都有一个与不同表相关的特定 ID。 (这就是我使用 RDBMS 的原因)。
目前,我使用“JSONB”类型列作为矩阵行的字段(每个矩阵行包含 10000 列)。
所以它看起来像这样 -
ID , 不同的表 ID, 矩阵行 (JSONB)

现在,我想查询此表以使用矩阵。例如,当查询应该已经在 python 中以矩阵形式检索它时,迭代 500 行矩阵的批次。

我该怎么做?
有没有更好的方法来存储这个矩阵,以便我以后可以操作它?
我应该使用 HDF5 而不是 SQL 吗?

【问题讨论】:

  • 您能否发布更多信息。单元格是什么类型,可能是数字?这500行,是怎么选出来的?你需要所有这些吗?为什么不同的表 ID?那是外键吗?不同的表与矩阵行有什么关系?
  • 矩阵单元格是数字,所有列都被选中,另一个表ID是连接到不同表的外键(一对一)
  • 通常插入多少行。您是因为范围而选择一行,要在其中找到单个单元格,还是因为特定的数字组合而需要这些行?数字分布均匀吗?是否有很多不同的单元格编号值,如果没有,您可以考虑使用位图索引。
  • @aschoerk 有超过 100000 行。这些行也分批插入。数字分布不均。该矩阵代表一个特定的向量空间 - 一个训练有素的模型。我需要批量查询它,因为我不想将所有这些都保存在内存中,并且我需要能够将它用于一些数字操作,例如使用点积等...

标签: python sql postgresql matrix hdf5


【解决方案1】:

我假设,目前您尝试通过让 postgres 搜索 json-content 来让“Different-Table-ID”适合单元格内容。我假设这个搜索会查看 100000 条记录并进行 10000 次比较。如果一次搜索返回 500 条记录,这意味着 0.5% 是至少 10 亿整数或浮点比较 (4 GByte) 或双倍 8 GByte 的结果。如果您不想将其保存在主内存中,现在这很容易,但想使用 SQL-DBMS:

根据以下建议进行定义是合理的:

  1. 使用两个表

表 1:行 ID,不同的表 ID

表 2:行 ID、单元格索引(2 字节)、单元格内容(4 字节)

  1. 如果 Row-ID 不重要:只有一个表

Different-Table-ID、Cell-Index(2 字节,因为小于 32000)、Cell-Content(4 字节?)

考虑将这些表定义为https://www.postgresql.org/docs/current/sql-cluster.html

如果单元格的顺序不重要,则删除单元格索引

  1. 如果单元格内容值变化不大,那么如果它们可能只包含 0 到 32000 之间的值,您也可以考虑使用位图索引。

在所有情况下,postgres 都应该能够避免搜索所有 100000 条记录来返回结果。总而言之,查看范围很重要,可能需要不同的 ID 和值。您从一开始就可以定义的范围越小,postgres 可以更好地优化搜索。一切都比必须为每个查询搜索 4 GByte+ 空间要好。

【讨论】:

  • 好吧,其实我只是根据外键查询这张表,当我想用​​矩阵做一些计算时,我就批量迭代地查询这张表。我主要关心的是以某种方式将表中的行转换为python中的(如numpy)矩阵以用于特定计算(如点积等)。我将检查 sql 集群。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 2019-11-04
相关资源
最近更新 更多