gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 22:13:14 24 4
gpt4 key购买 nike

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

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

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

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

我的一个新想法

如果您可以将整个表格读入一个 TreeSet 中,该 TreeSet 会根据您搜索的内容/排序依据加载不同的比较器。那么搜索将同样快,无论您正在搜索什么。这样做的缺点当然是必须将整个文件写入放置在 TreeSet 中的对象中,这可能会占用大量 RAM。你怎么看?

最佳答案

我首先想到的是索引。如果您继续开发 DBMS,无论如何都会遇到对各种类型索引的需求(二叉树、 HashMap 等)。索引需要内容的直接映射才能有效。顺序扫描文件的行不会。

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

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

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

  • 您可以研究 sqlite 的实现以获得想法,因为它具有非常紧凑的存储布局。

关于java - 在大型平面文件中分隔值的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19843748/

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