sql - 存储二维稀疏数组(二维稀疏矩阵)的最佳方式是什么?它在 VoltDB 中的大小是多少?

标签 sql database matrix sparse-matrix voltdb

问题一:是否有专门的数据库来存储密集矩阵和稀疏矩阵?我用谷歌搜索但没有找到任何...

所讨论的矩阵很大(10^5 x 10^5),但它很稀疏,这意味着它的大部分值都是零,我只需要存储非零值。所以我想到制作一个这样的表格:

   2D Matrix
---------------
  X   Y   val
---------------
  1   2    4.2
  5   1    91.0
  9   3    139.1

等等。 3 列,其中两列表示坐标,第三列表示稀疏矩阵中该单元格的值。 问题 2:这是存储稀疏矩阵的最佳方式吗?我也考虑过 MongoDB,但似乎为矩阵的每个单元创建一个文档会带来太多开销。面向表的数据库很慢,但我可以使用 VoltDB :) 侧节点:我想到了 Redis 哈希,但无法使其成为二维(找到了一种序列化 2D 矩阵并使其成为 1D 的方法,这样我可以存储在Redis 哈希甚至列表)

问题 3:VoltDB 将使用每行多少字节?坐标将是从 0 到 10^5 甚至更多的整数,单元格的值将是 float 。

最佳答案

关于问题3,根据您的示例,X和Y列可能是VoltDB中的INTEGER数据类型,即4个字节。值列可以是 FLOAT 数据类型,即 8 个字节。

因此,每条记录为 16 字节,因此内存中的标称大小将为 16 字节 * 行数。一般来说,您添加 30% 的开销,然后为每台服务器添加 1GB 的堆大小,以确定所需的总体内存。有关更多详细信息,请参阅下面的引用资料。

您可能想要为此表建立索引,因此假设您想要 (x,y) 的复合索引,则大小如下:

树索引: (列大小总和 + 8 + 32)* 行数 哈希索引: (((2 * 行数) + 1) * 8) + ((列大小总和 + 32) * 行数)

(x,y) 的列大小总和为 8 个字节。

引用文献:

使用 VoltDB 的附录 A 中列出了可用的数据类型: http://community.voltdb.com/docs/UsingVoltDB/ddlref_createtable#TabDatatypes

VoltDB 规划指南中提供了估计内存大小的指南和公式: http://community.voltdb.com/docs/PlanningGuide/ChapMemoryRecs

关于sql - 存储二维稀疏数组(二维稀疏矩阵)的最佳方式是什么?它在 VoltDB 中的大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10872769/

相关文章:

sql - 如何为 Spark SQL DataFrame 映射构造 ClassTag?

计算矩阵中的行总和

c - 从不兼容的指针类型传递参数 1 of 'printf'

python - Django 中的动态查询,WHERE 子句中包含 "|"字符,表名中包含变量

c - 如何在 C 中传递指向多维数组的指针?

MySQL 多级父子 SP 和 IN 子句

sql - 计算其 parent 拥有的根的百分比

mysql - 计算特定日期具有相同列值的行数

mysql - 我可以在大多数表中使用外键作为主键吗?

java - 统一查询语言以访问异构数据库中的数据