如何在特定地址创建 SQLite 内存数据库
How to create SQLite in-memory database at specific address
我想使用 SQLite 在文件中存储一些元数据信息。这个文件已经是 mmap 了。我想要做的是创建一个 SQLite 数据库,传入一个 char* 来告诉它在哪里创建数据库,而不是让它分配自己的数据库。这可以做到吗?内存数据库的 SQLite 文档只是说使用“:内存:”,并且数据库将在进程结束时被销毁,没有指示如何使用已经存在的数据或持久化它。
如果没有,Linux 上有哪些解决方法?是否有 "inverse" mmap,以便我可以获取地址并将其映射到新文件? (那么 /foo 会是 /bar 的一部分的视图吗?)
内存数据库只是页面缓存未保存到磁盘的数据库。
没有访问这些页面的机制。
您唯一的选择是实现自己的 VFS 以将文件访问重定向到该文件的正确部分。
我不是 SQLite 专家,但您似乎可以使用此处的信息来使用您自己的分配器,并控制 SQLite 创建内存数据库的内存位置:https://www.sqlite.org/c3ref/mem_methods.html
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.
我想使用 SQLite 在文件中存储一些元数据信息。这个文件已经是 mmap 了。我想要做的是创建一个 SQLite 数据库,传入一个 char* 来告诉它在哪里创建数据库,而不是让它分配自己的数据库。这可以做到吗?内存数据库的 SQLite 文档只是说使用“:内存:”,并且数据库将在进程结束时被销毁,没有指示如何使用已经存在的数据或持久化它。
如果没有,Linux 上有哪些解决方法?是否有 "inverse" mmap,以便我可以获取地址并将其映射到新文件? (那么 /foo 会是 /bar 的一部分的视图吗?)
内存数据库只是页面缓存未保存到磁盘的数据库。
没有访问这些页面的机制。
您唯一的选择是实现自己的 VFS 以将文件访问重定向到该文件的正确部分。
我不是 SQLite 专家,但您似乎可以使用此处的信息来使用您自己的分配器,并控制 SQLite 创建内存数据库的内存位置:https://www.sqlite.org/c3ref/mem_methods.html
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.