Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 存储稀疏矩阵的数据库_Ruby_Database_Nosql_Sparse Matrix - Fatal编程技术网

Ruby 存储稀疏矩阵的数据库

Ruby 存储稀疏矩阵的数据库,ruby,database,nosql,sparse-matrix,Ruby,Database,Nosql,Sparse Matrix,我有一个非常大且非常稀疏的矩阵,只由0和1组成。然后我基本上处理(行-列)对。我每行/每列最多有10k对 我的需要如下: 并行插入(行-列)对 快速检索整行或整列 快速查询(行-列)对的存在性 如果可能的话,一个Ruby客户端 现有数据库是否适用于此类约束 如果没有,什么能让我获得最好的表现: SQL数据库,具有如下表: 行(索引)|列(索引)(但索引必须不断刷新) 一个NoSQL键值存储,包含如下两个表: row=>columns ordered list column=>row

我有一个非常大且非常稀疏的矩阵,只由0和1组成。然后我基本上处理(行-列)对。我每行/每列最多有10k对

我的需要如下:

  • 并行插入(行-列)对

  • 快速检索整行或整列

  • 快速查询(行-列)对的存在性

  • 如果可能的话,一个Ruby客户端


现有数据库是否适用于此类约束

如果没有,什么能让我获得最好的表现:

  • SQL数据库,具有如下表:
行(索引)|列(索引)
(但索引必须不断刷新)

  • 一个NoSQL键值存储,包含如下两个表:
row=>columns ordered list

column=>rows-ordered-list

(但在列表中并行插入元素)

  • 别的

谢谢你的帮助

稀疏的0/1矩阵在我听来像是一个,用来表示图形。基于此,您可能正在尝试解决一些图形问题,并且图形数据库将满足您的需要

例如,图形数据库非常适合快速遍历图形,因为检索顶点的邻域需要O(给定顶点的邻域数),因此它与整个图形中的顶点数无关。Neo4J也是事务性的,所以并行插入不是问题。您可以在Ruby中使用MRI,也可以使用更无缝的集成

另一方面,如果您正在尝试分析图中的连接,并且偶尔进行一次分析就足够了,并且只需提供结果,那么您可以尝试使用基于的图形处理框架。它有点像Map Reduce,但目标是图形处理。已经有了


但是,如果图形数据库或图形处理框架不适合您的需要,我建议您看看,这是一个基于的开源、面向列的数据存储。它的数据模型实际上非常类似于您所描述的(稀疏矩阵),它具有行级事务,不需要您检索整行,只需检查某一对是否存在。有一些,但我认为使用JRuby而不是MRI与之交互会更安全。

如果您的矩阵非常稀疏(即节点只有少量互连),那么您将从RDBMS(如Oracle、PostgreSQL或SQL Server)获得相当高效的存储。基本上,您将有一个表,其中有两个字段(行、列)和一个索引或键

单向设置主键(取决于您主要是按行还是按列进行查询),反向设置字段的另一个索引。这将只在存在连接的地方存储数据,并且它将与图中的边数成比例

索引将允许您高效地检索行或列,并且始终保持同步

如果有10000个节点和每个节点10个连接,则数据库将只有100000个条目。每个节点100个EDNGE将有1000000个条目,以此类推。对于稀疏连接,这应该是相当有效的

fag数据包的背面估计值

此表基本上有一个行和列字段。如果聚集索引为(行、列、值),则其他覆盖索引为(列、行、值)。如果添加和删除是随机的(即不按行或列进行批处理),则i/O将是仅表格的两倍

如果按行或列对插入进行批处理,则其中一个索引上的I/O将减少,因为记录在其中一个索引中物理上位于一起。如果矩阵真的是稀疏的,那么这种邻接列表表示是迄今为止存储它的最紧凑的方式,这将比将其存储为2D数组快得多

具有64位值的10000 x 10000矩阵需要800MB加上行索引。更新一个值需要每次写入至少80k(写出整行)。如果数据可以在插入时按行分组,则可以按行优化写入。如果插入是实时和随机的,那么您将为每个插入写出80k行

实际上,这些写操作会有一定的效率,因为所有的数据都会被写在一个几乎连续的区域中,这取决于NoSQL平台物理存储数据的方式

我不知道你的连接有多稀疏,但如果每个节点平均有100个连接,那么你将有1000000条记录。这大约是每行16个字节(Int4行、Int4列、双值),加上集群表和覆盖索引的一些字节开销。这种结构将需要大约32MB的存储开销

假设插入不是按行或列排序的,则更新行或列上的单个记录将导致随机访问的两个磁盘块写入(实际上是8k,一个段)

向数组表示中添加100万个随机排序的条目将导致大约80GB的写操作+少量开销。在邻接列表表示中添加1m个条目将导致大约32MB的写入(实际上是16GB,因为整个块将为每个索引叶节点写入),外加一点开销

对于该连接级别(10000个节点,每个节点100条边),将显示邻接列表
在存储空间和I/O方面效率更高。您将从该平台获得一些优化,因此某种基准可能适合于查看实践中哪个更快。

我不确定Math.SE网站是否知道答案……如果我的矩阵具有较高的插入率,那么