问题一:是否有专门的数据库来存储密集矩阵和稀疏矩阵?我用谷歌搜索但没有找到任何...
所讨论的矩阵很大(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/