【问题标题】:How to store a sparse queryable matrix on disk or database?如何在磁盘或数据库上存储稀疏的可查询矩阵?
【发布时间】:2009-02-28 14:42:59
【问题描述】:

我需要在磁盘上存储一个稀疏矩阵。它就像一个具有数百万行和数千列的数据库表,其中许多或大多数列是空的。它需要是可查询的,例如在某些列上带有 WHERE 的 SQL SELECT。

我的具体要求是 Java。一开始想用Berkeley DB for Java模拟一张表,后来不支持基于值的查询。

然后,我考虑使用常规的 SQL 数据库。例如,创建仅具有行 ID、列 ID 和值的架构。虚拟行将是具有相同 ID 的所有实际行。但是,这看起来像是数据库滥用。

有什么想法吗?

【问题讨论】:

  • 能否请您更新此线程,说明您实际做了什么以及效果如何?
  • 感谢您的关注。我实际上并没有继续这个项目。

标签: database-design data-structures


【解决方案1】:

在阅读问题标题时,我首先想到的是每 (x,y) 的数据库行,正如您在最后一段中所建议的那样。

另外需要注意的是,数据库通常会压缩行,尤其是对于 NULL,因此直接的表示可能不会像您想象的那样浪费空间。

【讨论】:

    【解决方案2】:

    这取决于您对“许多或大多数列为空”的定义,但这听起来是一种非常合理的方法,假设您确实需要随机访问。

    如果您可以通过顺序处理(例如按行顺序扫描)完成所有操作,那么平面文件将是另一个值得考虑的合理选择。

    【讨论】:

      【解决方案3】:

      Intersystems Cache 数据库在内部使用结构来存储数据,这些结构是稀疏的多维数组。也许检查一下。您可以查询它,并将其映射到 SQL 表。我不确定您是否可以直接从 java 访问 Intersystems Cache 中的多维数组。

      【讨论】:

        【解决方案4】:

        如果您只需要按照您所说的“在磁盘上”保存数据、读回并进行某些查询,您可能需要考虑简单地序列化您自己设计和选择的类。消除了对数据库基础架构的所有需求,但显然也排除了数据库实际上可以帮助您的许多事情,

        【讨论】:

          【解决方案5】:

          最近,我对 key-value 类型的存储产生了兴趣,并且偶然发现了这篇博客文章,描述了 FriendFeed 如何使用 MySQL 来实现类似的需求:

          http://bret.appspot.com/entry/how-friendfeed-uses-mysql

          【讨论】:

            猜你喜欢
            • 2014-05-23
            • 2015-09-01
            • 2014-10-19
            • 2010-11-02
            • 2015-09-10
            • 2013-02-06
            • 2011-03-29
            • 2019-03-12
            • 1970-01-01
            相关资源
            最近更新 更多