6

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

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

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

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

最好的方法是什么?

4

3 回答 3

1

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

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

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

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

于 2010-09-19T19:22:51.537 回答
0

为什么不使用hsqldbh2

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

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

于 2010-08-07T00:07:34.117 回答
0

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

于 2010-08-06T17:36:53.200 回答