(10元)为什么UTF8的TXT文件存入SQLite后大小增加近三倍?

为什么我的一个txt文件大小是600MB(utf8),其中全部为英文单词和符号(一篇篇英文文章)。我将每一个词一行存入sqlite中(TEXT)后,大小为1.5GB,大了近三倍?有没有办法做到跟原文件差不多大小。

悬赏10元

我问了gpt,但是没有得到答案。没有使用索引。

阅读 482
1 个回答

写了半天还是删掉了,看看AI的答案:

文本行数和平均长度
假设文件大小为 500MB,每行一个单词(含换行符 \n),平均每行长度为 8 字节(例如:7 字母的单词 + 1 字节换行符)。
总行数 ≈ 500,000,000 字节 / 8 字节/行 ≈ 62,500,000 行。
单行存储开销
SQLite 存储一行数据时,需要以下额外开销:
rowid(主键,varint 编码):约 3-4 字节(62M 行时需 3 字节,更多行时需 4 字节)。
类型头和长度字段:约 2-3 字节(TEXT 类型编码 + 字符串长度)。
页内指针和 Payload 长度:约 3 字节(每行的页内偏移量)。
总开销 ≈ 8-10 字节/行(不含实际数据)。
实际数据存储
每行文本占 L 字节(如平均 8 字节)。
单行总空间 ≈ L + 8-10 字节(例如 8+10=18 字节/行)。
页空间利用率
SQLite 默认页大小为 4KB(4096 字节)。
每页可存储行数 ≈ 4096 / 18 ≈ 227 行,页利用率接近 100%。
页管理开销:每页有约 2-5% 的元数据(页头、空闲空间指针等)。

总之就是每存一行数据,数据库在记录的时候都要记录这行数据的类型长度等信息,这些信息也是要占用磁盘空间的。

我感觉这个需求很奇怪,是需要解决什么问题,要把单词这样存储在sqlite中呢?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏