如何在特定地址创建 SQLite 内存数据库

Posted

技术标签:

【中文标题】如何在特定地址创建 SQLite 内存数据库【英文标题】:How to create SQLite in-memory database at specific address 【发布时间】:2016-04-21 12:15:00 【问题描述】:

我想使用 SQLite 在文件中存储一些元数据信息。这个文件已经被 mmap 了。我想要做的是创建一个 SQLite 数据库,传入一个 char* 来告诉它在哪里制作数据库,而不是让它自己分配。这可以做到吗?内存数据库的 SQLite 文档只是说使用“:memory:”,并且数据库将在进程结束时被销毁,没有说明如何使用已经存在的数据或将其持久化。

如果没有,Linux 上有哪些解决方法?是否有“逆”mmap,所以我可以获取地址并将其映射到新文件? (所以 /foo 将是 /bar 的一部分的视图?)

【问题讨论】:

【参考方案1】:

VFS 绝对是要走的路,但您甚至不需要自己编写:sqlite3 发行版包含一个文件ext/misc/memvfs.c,它已经实现了您所需要的:

USAGE:

sqlite3_open_v2("file:/whatever?ptr=0xf05538&sz=14336&max=65536", &db,
                   SQLITE_OPEN_READWRITE | SQLITE_OPEN_URI,
                   "memvfs");

These are the query parameters:

   ptr=          The address of the memory buffer that holds the database.

   sz=           The current size the database file

   maxsz=        The maximum size of the database.  In other words, the
                 amount of space allocated for the ptr= buffer.

   freeonclose=  If true, then sqlite3_free() is called on the ptr=
                 value when the connection closes.

The ptr= and sz= query parameters are required.  If maxsz= is omitted,
then it defaults to the sz= value.  Parameter values can be in either
decimal or hexadecimal.  The filename in the URI is ignored.

【讨论】:

【参考方案2】:

内存数据库只是页面缓存没有保存到磁盘的数据库。

没有访问这些页面的机制。

您唯一的选择是实现您自己的 VFS 以将文件访问重定向到该文件的正确部分。

【讨论】:

"内存数据库只是页面缓存没有保存到磁盘的数据库。"这必须专门针对 SQLite 内存数据库,因为一般的内存数据库系统绝对不是这样。【参考方案3】:

我不是 SQLite 专家,但您似乎可以使用此处的信息来使用自己的分配器,并控制 SQLite 创建内存数据库的内存位置:https://www.sqlite.org/c3ref/mem_methods.html

【讨论】:

但是你不知道什么分配用于什么目的。 这有关系吗?如果您的目标是控制 SQLite 使用的内存(即知道/控制创建 IMDB 的内存地址),那么似乎可以做到这一点。也许我错过了什么...... 我什至不介意在磁盘上创建它。但我需要从内存中打开它。看起来 VFS 是要走的路。

以上是关于如何在特定地址创建 SQLite 内存数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Python 数据帧存储在内存中并将其作为 excel 附件发送到特定的电子邮件地址?

SQLite 中的各种限制

在特定内存地址创建新的 C++ 对象?

顺序表的原理

使用内存选项创建 Sqlite3 数据库

SQLite 如何变成 内存数据库