在大型平面文件中分隔值的最佳方法

时间:2013-11-07 18:25:57

标签: java database

我正在创建一个DBMS(基本上是一个处理SQL查询的软件),仅仅是为了娱乐和学习体验。我需要知道分离值和行的最佳方法。

对于表配置,我使用XML,因为它是存储信息的好方法。虽然所有插入的行都无法做到这一点,因为所有xml标记都会占用大量内存。我还考虑过序列化代表数据库的所有对象(因为我使用Java)来存储数据,但我猜测这也会占用大量内存。

所以我唯一能想到的就是使用一些值分隔符和行分隔符来占用最少的内存。虽然分隔符作为单个字符的问题(如果我使用多字符,我可能也使用XML)是如果该分隔符在其中一个值中,则会出现问题。所以我想如果我可以使用没有附加符号的十六进制字符。那存在吗?如果是这样,这是一个好方法吗?一个问题是,如果我将来开始允许BLOB。那些包含二进制数据,可能包含我的值分隔符。什么是最好的解决方案?

告诉我你的想法!我愿意讨论。此外,如果有人知道MySQL(或其他一些广泛使用的SQL引擎)如何存储数据,那可能会很有趣。

我得到了一个新想法

如果您可以根据您搜索/排序的内容将整个表读入加载了不同比较器的TreeSet,该怎么办?然后搜索将同样快速,你正在搜索。这样做的缺点当然是整个文件必须写入放置在TreeSet中的对象,可能是很多RAM。你觉得怎么样?

1 个答案:

答案 0 :(得分:3)

我首先想到的是索引。如果你不断开发DBMS,你将无论如何都需要各种类型的索引(二叉树,哈希映射等)。索引需要直接映射内容才有效。顺序扫描文件的行不会是。

  • 如果您的行具有固定长度(取决于表数据定义),您可以从记录到记录以及列之间修复偏移量。

  • 如果记录的长度不同,您可以按照与上述相同的方式处理固定长度的列。对于动态可变大小的字段,可以有一个固定大小的引用(偏移值)到文件中的另一个部分,包含动态大小的值。零引用可以视为NULL,因为您的文件很可能有一个标题。

  • 另一个选项是维护一个行索引,该行索引具有对行数据的单独偏移量,可能具有2 ^ N粒度(分页)。偏移量应与实际数据的对齐方式匹配,尤其是在将文件映射到内存中时。首先,该索引可以是二进制搜索的简单有序列表,也可以是单独的文件。但是,如您所述,这将需要一些列分隔符。我会采用字段长度编码,因为它不需要对实际字段内容进行特殊处理(例如转义)。将字段长度保持在另一个结构中可能是有效的,该结构由该索引映射或直接嵌入该索引中(因为动态列的数量是固定的)。负字段长度也可以指定NULL值。

  • 您可以查看sqlite的创意实现,因为它具有非常紧凑的存储布局。