gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:00:55 25 4
gpt4 key购买 nike

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

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

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

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

什么是最好的方法?

最佳答案

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

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

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

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

关于java - 存储任意数据库表的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3426085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com