如何在特定地址

时间:2016-04-21 12:15:01

标签: sqlite mmap in-memory-database ramdisk

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

如果没有,Linux上有哪些变通方法?是否有“反向”mmap,所以我可以获取一个地址并将其映射到一个新文件? (所以/ foo会看到/ bar的一部分吗?)

3 个答案:

答案 0 :(得分:2)

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.

答案 1 :(得分:1)

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

没有机制可以访问这些页面。

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

答案 2 :(得分:1)

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