在单个文件中实现数据库

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 有一个位置参数,允许您指定文件中开始阅读的位置。

以上是关于在单个文件中实现数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中实现多个线程来下载单个表数据?

尝试在 Redshift 中实现并行性

PL/SQL-表和条件都不同时如何在单个查询中实现多条count语句

至少一个表包含所需值时的 SQL JOIN:这可以在单个查询中实现吗?

SpringMVC学习08SpringMVC中实现文件上传

在 Android 的单个菜单项中实现三个操作