在单个文件中实现数据库
Posted
技术标签:
【中文标题】在单个文件中实现数据库【英文标题】:Implementing a database in a single file 【发布时间】:2020-10-25 10:30:18 【问题描述】:这个问题是关于创建一个新的单文件数据库格式。我是新手!
我想知道 SQLite 是如何做到这一点的——对于大于可用内存的数据库,SQLite 必须以某种方式从文件的某些部分读取,即在位置 n 处读取?
在亚线性运行时复杂度下这可能吗?我假设当 SQLite 获取特定行时,它首先使用 O(logn) 索引查找 - 所以它不会获取整个索引 - 然后它从文件中的特定位置获取行。所有这些都涉及不将整个文件读入内存——但 FS 方法似乎不提供此功能。
fs.skip(n) [伪代码] 是在 O(n) 中完成还是操作系统直接跳到位置 n?从理论上讲,这应该是可能的,因为在 OS 文件中,文件被分为块 - 并且 inode 引用 1-3 级的类似数组的结构来定位块,因此在亚线性时间内获取文件中的特定块应该是可能的 - 无需读取整个文件。
【问题讨论】:
相关:***.com/questions/51801213/… @Ry- 谢谢,这回答了我的问题! 【参考方案1】:我想知道 SQLite 是如何做到这一点的——对于大于可用内存的数据库,SQLite 必须以某种方式从文件的某些部分读取,即在位置 n 读取?
是的。几乎每种编程语言都有说明如何在文件中定位读取的文档。
所有这些都涉及不将整个文件读入内存——但 FS 方法似乎没有 提供此功能。
我所知道的每个文件系统访问 API确实支持这一点,文档中对此进行了解释。示例范围从 Windows 中的内存映射文件(“相当”高级,如果您计划与操作系统无关,则不受支持),一直到诸如 C 中用于定位文件流的 fseek()
方法等简单的东西。
我建议用你选择的编程语言复习你对文件系统访问方法的了解。
【讨论】:
这是一个不允许您将读取定位在文件上的编程语言文档:nodejs.org/api/fs.html#fs_read_file 不,那是您没有阅读文档的证明。我可以直截了当地指出 fs.read 有一个位置参数,允许您指定文件中开始阅读的位置。以上是关于在单个文件中实现数据库的主要内容,如果未能解决你的问题,请参考以下文章
PL/SQL-表和条件都不同时如何在单个查询中实现多条count语句