Python 3:最优字符串压缩方法以减少sqlite3数据库大小
我最近写了一个脚本,可以把几个网络代理的日志整理成一个整洁的sqlite3数据库文件,这个文件对我来说运行得很好……不过有一个问题,就是文件大小。我被要求使用这种格式(sqlite3数据库),而且Python对它的支持非常好,所以我想问的是……在文件大小是唯一考虑因素的情况下,使用什么样的字符串压缩方式最好呢?zlib?base-n?还是克林贡?
任何建议都对我很有帮助,再次强调,我只需要对符合URL的字符进行字符串压缩。
3 个回答
在把数据放进数据库之前,你会做什么样的解析呢?我感觉这可能很简单,可能只用一个表来存每一条记录。如果不是这样,那我就抱歉了。
压缩的关键在于去掉重复的部分,而在日志文件中,大多数重复是出现在不同记录之间,而不是每条记录内部。所以单独压缩每一条记录可能效果不大。
这只是我随便想的,所以你可以随意反驳,但我觉得可以把这个表拆分成几个小表,分别存储记录的不同部分。这样一来,一条日志记录主要就包括一个时间戳(用日期类型而不是字符串)和一些指向其他表的索引(比如请求的IP、请求类型、请求的URL、浏览器类型等等)。
当然,这样做会有一些权衡,因为这会让数据库的维护变得更加复杂,但另一方面,这样可以进行一些有意义的查询,比如“给我看看过去一周请求过页面X的所有独立IP”。
与其在你的程序里加入压缩和解压缩的代码,不如把这个表格直接存放在一个压缩的硬盘上。
这里有一个页面,介绍了一个可以让SQLite数据库压缩数据的扩展。
这个扩展提供了一个可以在单独字段上调用的函数。
以下是页面上的一些示例文本:
创建一个测试表
sqlite> create table test(name varchar(20),surname varchar(20));
通过压缩文本向测试表中插入一些文本,你也可以压缩二进制内容并将其插入到一个blob字段中。
sqlite> insert into test values(mycompress('这是一个示例文本'),mycompress('这是一个示例文本'));
这条命令不会显示任何内容,因为我们的数据是以二进制格式存储并且已经压缩了。
sqlite> select * from test;
接下来这条命令可以解压缩数据。
sqlite> select myuncompress(name),myuncompress(surname) from test;