2

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

有问题的矩阵很大(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 的整数,可能更多,单元格的值将是浮点数。

4

2 回答 2

2

两个最相关的问题是 1)有多稀疏?2)你想如何使用数据?

首先,我假设您想从数据库中读取/写入/处理数据。如果没有,那么有许多稀疏矩阵编码甚至可以打包成一个 blob 并可选地压缩。

假设您的数据相当稀疏,并且假设您想使用数据库中的数据,那么 x,y,value 元组存储可能是最好的。VoltDB 规划指南的第 4 章涵盖了估计内存使用量和调整硬件大小。

http://community.voltdb.com/docs/PlanningGuide/ChapMemoryRecs

简短的回答是带有数字数据的表格非常紧凑。每行有 12 个字节的实际数据(短、短、双)。您应该看到平均每行开销超过 1 个字节。您还需要添加任何索引的大小。该文档描述了最坏的情况。我认为对于两个短整数(例如 X 和 Y 列)的索引,每个键的存储空间将接近 28 个字节,包括开销。

于 2012-06-06T18:19:45.043 回答
2

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

因此,每条记录将是 16 字节,因此内存中的标称大小将为 16 字节 * 行数。通常,您增加 30% 的开销,然后每台服务器增加 1GB 的堆大小以确定所需的整体内存。有关详细信息,请参阅下面的参考资料。

你可能想要索引这个表,所以假设你想要一个 (x,y) 的复合索引,大小如下:

树索引:(sum-of-column-sizes + 8 + 32) * rowcount 哈希索引:(((2 * rowcount) + 1) * 8) + ((sum-of-column-sizes + 32) * rowcount)

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

参考:

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

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

于 2012-06-06T17:32:37.363 回答