Ios 如何计算sqlite3写入容量

Ios 如何计算sqlite3写入容量,ios,iphone,sqlite,Ios,Iphone,Sqlite,我创建测试表 create table if not exists `HKDevice` (primaryID integer PRIMARY KEY AUTOINCREMENT,mac integer) 插入1行: NSString *sql = @"insert into `HKDevice` (mac)values('0')"; int result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errorMesg); 磁盘

我创建测试表

create table if  not exists `HKDevice` (primaryID integer PRIMARY KEY AUTOINCREMENT,mac integer)
插入1行:

NSString *sql = @"insert into `HKDevice` (mac)values('0')";
int result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errorMesg);
磁盘报告写入48kb

这比我想象的要大得多,我知道sqlite中的整数大小为4字节,我认为写入总量应该小于10字节。
第二次书写的大小也接近第一次,所以我更困惑。。。。。。
有人能告诉我为什么吗?谢谢

将涉及一些元数据开销。首先,将创建数据库文件,该文件必须维护表、索引、序列、自定义函数等的模式。这些都有助于磁盘空间的使用

例如,在Linux上,将上面定义的数据库表添加到新数据库会导致文件大小为12288字节(12KB)。如果需要更多的表,空间需求将增加,就像向表中添加数据一样

此外,出于效率原因,数据库通常以“页”的形式将数据写入磁盘,即页(或块)分配并写入的空间为。将选择页面大小以优化I/O,例如4096字节。因此,如果需要新页面,则写入单个整数可能需要4KB的磁盘空间。但是,您会注意到,写入第二个整数不会消耗更多的空间,因为现有页面中有足够的可用空间。一旦页面变满,将分配一个新页面,并且磁盘大小可能会增加


上面的内容有点简化。数据库页面分配和管理的策略是一个复杂的主题。我确信搜索会找到许多包含SQLite详细信息的资源。

将每一行单独写入文件对于更大的操作来说效率很低,因此数据库总是读取和写入e整整三页

INSERT命令至少需要修改三页:表数据、包含自动增量计数器的系统表以及数据库头中的数据库更改计数器

要使更改原子化,即使是在中断的情况下,数据库也需要这样做。所以总共有六页

如果不在这两个命令周围使用显式事务,那么每个命令都会自动包装到一个自动事务中,因此两个命令都会被写入,总共有12页

默认页面大小为4KB,这是您看到的写入量。
(显然,报告中没有显示文件系统元数据的写入。)

实际上,第二次写入的大小也接近第一次写入的大小,因此我更困惑……这不是我所经历的。文件大小需要527个相同的提交插入才能更改。这在很大程度上取决于DB引擎的调整,这在操作系统和环境中无疑是不同的。如果您的DB文件增加在我的项目中,有时需要插入或更新表中超过200~500行,这将是写入速率5~10MB/s太快,使UI队列阻塞一秒钟。我想了解更多关于sqlite写入的内容。似乎我误解了你的问题。你是在说关于数据传输而不是磁盘空间使用。我认为@CL更好地解决了这个问题。