我有一个 7.4Gb 的 csv 文件。使用python 脚本将其转换为 sqlite 数据库后,输出数据库为 4.7Gb,约为原始大小的 60%。
csv 有大约 150,000,000 行。它有标题:
tkey,ipaddr,healthtime,numconnections,policystatus,activityflag
每行看起来像
261846,172.10.28.15,2012-02-03 16:15:00,22,1,1
该脚本使用 healthtime 将数据拆分为表 192 表
当我第一次看到这些数字时,我以为我在某个地方犯了错误。从仅写入健康时间 192 次而不是 150,000,000 次的附加效率中,我应该期望文件大小减少多大?
编辑:我一发布这个我就意识到了答案。我删除了大约 40% 的字符串,因此大小减少了 40%。
编辑2让我们计算纯文本之间的大小差异:
"261846,172.10.28.15,2012-02-03 16:15:00,22,1,1"
和数据库条目:
db(261846,'172.10.28.15',22,1,1)
首先,我们在纯文本表示中从 46 个字符减少到 26 个字符。
剩下的字符是:
"261846,172.10.28.15,22,1,1"
或 26 个字节。如果每个整数都需要以 32 位(4 字节)存储,那么我们有:
12 字节 (ipaddr) + 4 字节 * 4(整数字段)= 28 字节。
所以看起来转换为整数会降低存储效率,而我的所有收益都来自于减少每行中存储的字符数。