存储任意数据库表的数据结构

时间:2010-08-06 17:13:45

标签: java data-structures scala datatable relational

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

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

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

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

最好的方法是什么?

3 个答案:

答案 0 :(得分:1)

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

这也更容易调试,并且与平台无关。当然它有一些限制:例如float不能按原样表示,但可以存储在类似于SQL DECIMAL格式的内容中。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

为什么不使用hsqldbh2

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

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