我想设计一个JVM数据结构(Java / Scala),可用于表示和存储任意关系数据库表的内容。数据结构应该很快(不是gc密集,缓存友好)和内存效率,因此更大的表可以适合RAM。
一种节省内存的解决方案是将每个列分别存储在基本数组中,但我担心缓存友好性,因为同一行中的项不会存储在一起。无论列的范围有多窄,包含N列的行都会导致N个缓存未命中。
另一种解决方案是将每一行存储在一个对象数组中,其中每个元素代表一个字段,并在检索时转换为正确的类型,但这需要以其盒装形式存储数字类型,因此它的内存效率不高。而且它可能也不是那么有效的缓存。
另一个解决方案是将每行的数据布局为字节数组,就像真正的数据库序列化它们的行一样,只使用必要的字节数。这是缓存友好和内存效率,但我担心每次访问时序列化/反序列化的成本。
最好的方法是什么?
答案 0 :(得分:1)
第四种解决方案是将每行的数据存储为字符串而不是字节数组。这可以避免大多数情况下的序列化成本 - 前提是大多数数据都是字符串。
这也更容易调试,并且与平台无关。当然它有一些限制:例如float不能按原样表示,但可以存储在类似于SQL DECIMAL格式的内容中。
任何解决方案都将是一种权衡。
编辑但是,我更喜欢你的情况下的字节数组解决方案:每行一个字节数组。对于固定大小的行,这应该对缓存最友好。但是,您还应该为可变大小的行提供解决方案。低级语言似乎更适合该任务,在C中可以定义两种格式:固定大小的行,其中表元数据包含列偏移(例如,第1列:字节0..31,第2列:字节32..127等)和第二个可变大小的行格式,其中行本身包含列大小(例如,字节1..3包含大小,以下字节数包含数据,然后另外4个字节包含大小,以下数据等等。)
答案 1 :(得分:0)
这样做的目的是什么?您可能最好只是将您从数据库中检索的数据(作为您映射到的对象)存储在某种缓存层(如EhCache,OSCache,memcache等)中,而不是重新发明轮子。
答案 2 :(得分:0)