sqlite3会压缩数据吗?

Mau*_*aus 25 python sqlite

我有一个7.4Gb的csv文件.使用python脚本将其转换为sqlite数据库后,输出DB为4.7Gb,约为原始大小的60%.

csv有大约150,000,000行.它有标题:

tkey,ipaddr,healthtime,numconnections,policystatus,activityflag
Run Code Online (Sandbox Code Playgroud)

每一行看起来都像

261846,172.10.28.15,2012-02-03 16:15:00,22,1,1
Run Code Online (Sandbox Code Playgroud)

该脚本使用healthtime将数据拆分为表192表

当我第一次看到这些数字时,我以为我在某个地方犯了错误.如果仅仅将健康时间写入192次而不是150,000,000次的额外效率,我应该期望文件大小的减少有多大?

编辑:我发布这个,我意识到答案.我正在移除大约40%的弦,因此尺寸缩小了40%.

编辑2让我们计算纯文本之间的大小差异:

"261846,172.10.28.15,2012-02-03 16:15:00,22,1,1" 
Run Code Online (Sandbox Code Playgroud)

和数据库条目:

db(261846,'172.10.28.15',22,1,1)
Run Code Online (Sandbox Code Playgroud)

首先,我们以纯文本表示从46个字符删除到26个字符.

剩下的字符是:

"261846,172.10.28.15,22,1,1"
Run Code Online (Sandbox Code Playgroud)

或26个字节.如果每个整数需要以32位(4字节)存储,那么我们有:

12字节(ipaddr)+ 4字节*4(整数字段)= 28字节.

所以看起来转换为整数会使存储效率稍微降低,而我所有的收益都会减少每行中存储的字符数.

Jus*_*ier 29

SQLite没有运行压缩算法,但它会将数据存储在二进制文件而不是文本文件中.这意味着可以更有效地存储数据,例如使用32位(4字节)数字来表示10,000,000而不是将其存储为8字节的文本(如果文件是unicode则更多).

如果您有兴趣,请参阅SQL数据库文件格式的更多详细信息.

那有意义吗?

  • 值得指出的是,SQLite只使用了必要的字节数.例如,值7只需要一个字节. (5认同)
  • 值7需要两个字节:串行类型varint,在这种情况下长度为一个字节,在这种情况下为一个字节的值.串行类型存在于数据库中的每个值,它是空值和数字的一个字节,对于blob和文本是一个最大为9个字节的可变长度.因此,例如,一个32位长的整数需要5个字节,64位浮点数是9个字节,因为在这两种情况下它都有一个单字节的串行类型. (5认同)

小智 17

默认情况下,SQLite不压缩它写入磁盘的数据; 但是,SQLite确实有一组"专有扩展"用于此目的和其他目的.ZIPVFS在链接中查找如下.

http://www.sqlite.org/support.htmlhttp://www.hwaci.com/sw/sqlite/prosupport.html

通过将字段编码为整数,可以在数据中实现大量"压缩".例如,IP地址被设计为适合单词(4个字节).地址的每个八位字节可以用字的一个字节表示.

string[] octets = '172.168.0.1'.split('.')
int ip = atoi(octets[0]) << 24
ip |= atoi(octets[1]) << 16
ip |= atoi(octets[2]) << 8
ip |= atoi(octets[3])
Run Code Online (Sandbox Code Playgroud)

此外,您的时间戳可以用Unix时间表示,这是自纪元以来的秒数.

UPDATE mytable SET healthtime = CAST(strftime('%s',healthtime) AS INTEGER);
Run Code Online (Sandbox Code Playgroud)

请参阅日期和时间功能

请注意CAST上面SQL中的指令:SQLite不强制列上的类型,因此您可以将一组数字存储为字符串; 增加字段大小超过必要(这也会使某些查询行为奇怪).

还有一件事:场地大小不是故事的唯一部分.请记住,索引占用空间,并且整数索引在磁盘大小和性能方面更有效.