【问题标题】:Data Structure To Store Arbitrary Database Tables存储任意数据库表的数据结构
【发布时间】:2010-08-06 17:13:44
【问题描述】:

我想设计一个 JVM 数据结构 (Java/Scala),可以用来表示和存储任意关系数据库表的内容。数据结构应该是快速的(不太需要 gc,缓存友好)和内存效率,所以更大的表可以容纳在 RAM 中。

一种节省内存的解决方案是将每一列分别存储在一个原始数组中,但我担心缓存的友好性,因为同一行中的项目不会存储在一起。有 N 列的行将导致 N 次缓存未命中,无论列有多窄。

另一种解决方案是将每一行存储在一个对象数组中,其中每个元素代表一个字段,并在检索时转换为正确的类型,但这需要将数字类型存储为其装箱形式,因此内存效率不是很高。而且它的缓存效率可能也不高。

另一种解决方案是将每一行的数据布局到一个字节数组中,就像真正的数据库序列化它们的行一样,只使用必要的字节数。这是缓存友好和内存效率高,但我担心每次访问的序列化/反序列化成本。

最好的方法是什么?

【问题讨论】:

    标签: java data-structures scala datatable relational


    【解决方案1】:

    第四个解决方案是将每一行的数据存储为字符串而不是字节数组。这可以避免大多数情况下的序列化成本 - 前提是大多数数据都是字符串。

    这也将更容易调试并且独立于平台。当然它有一些限制:例如浮点数不能按原样表示,但可以以类似于 SQL DECIMAL 格式的形式存储。

    任何解决方案都是一种权衡。

    编辑 但是,对于您的情况,我更喜欢字节数组解决方案:每行一个字节数组。对于固定大小的行,这应该对缓存最友好。但是,您还应该为可变大小的行提供解决方案。一种低级语言似乎更适合该任务,在 C 中可以定义两种格式:固定大小的行,其中表元数据包含列偏移(例如,第 1 列:字节 0..31,第 2 列:字节 32..127等),以及第二种可变大小行格式,其中行本身包含列大小(例如,字节 1..3 包含大小,以下字节数包含数据,然后另外 4 个字节包含大小,以下数据等等)。

    【讨论】:

      【解决方案2】:

      这样做的目的是什么?您可能最好将您从数据库中检索到的数据(作为您映射到的对象)简单地存储在某种缓存层中,例如 EhCache、OSCache、memcache 等,而不是重新发明轮子。

      【讨论】:

      • 它用于主内存数据库的副项目。
      【解决方案3】:

      为什么不使用hsqldbh2

      它们都支持内存模式并且是纯Java。它们强制您使用 SQL 进行访问,但另一方面,您不必实现自己的联接。

      两者都是开源的,因此您也可以将其用作性能基准,看看自己按列/按行数据结构是否会更快,是否值得。

      【讨论】:

      • HSQLdb 为只有一个整数列的表每行分配大约 80 个字节(即 4 个字节的实际数据)。根据:hsqldb.org/doc/2.0/guide/…
      猜你喜欢
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 2014-10-10
      相关资源
      最近更新 更多