- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在创建一个 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/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!