我需要在磁盘上存储稀疏矩阵。它就像一个包含数百万行和数千列的数据库表,其中许多列或大多数列都为空。它需要是可查询的,就像某些列上带有WHERE的SQL SELECT一样。
我的具体要求是Java。我首先想到使用Berkeley DB for Java来模拟表,但它不支持基于值的查询。
然后,我考虑使用常规SQL数据库。例如,创建仅包含行ID,列ID和值的模式。虚拟行将是具有相同ID的所有实际行。但是,这看起来像数据库滥用。
有什么想法吗?
答案 0 :(得分:3)
在阅读问题标题时,我首先想到的是每个(x,y)的数据库行,如您在最后一段中的建议所示。
另一件需要注意的事情是数据库经常压缩行,特别是对于NULL,因此直截了当的表示可能不会浪费你想象的那么多空间。
答案 1 :(得分:1)
这取决于你的定义“很多或大多数列是空的”,但这听起来像一个非常合理的方法,假设你确实需要随机访问。
如果您可以通过顺序处理(例如按行顺序扫描)执行所有操作,那么平面文件将是另一个合理的选择。
答案 2 :(得分:1)
Intersystems Cache数据库在内部使用结构来存储数据,这些数据是稀疏的多维数组。也许检查出来。您可以查询它,并将其映射到SQL表。我不确定你是否可以从java直接访问Intersystems Cache中的多维数组。
答案 3 :(得分:1)
如果您只需按照“在磁盘上”说的那样保存数据,请将其读回&做某些查询,你可能想要考虑简单地序列化你自己的设计和选择的类。消除了对数据库基础架构的所有需求,但显然也排除了数据库实际可以帮助您的许多事情,
答案 4 :(得分:1)
最近,我对键值类型存储感兴趣,并且遇到了这篇博客文章,描述了FriendFeed如何使用MySQL来实现类似的要求: