Loading...

Tag Archive for 'deflate'

    AD: 猛买网,精彩团购 | Jobsdigg | 很棒的男装店 | 网站地图

Rails中压缩存储文本数据

继续压缩话题。之前写了 Rails生成压缩的静态缓存,以及配置nginx以支持直接发送压缩文件两篇文章。今天谈的是在Rails中,将大段文本内容以压缩格式存在数据库。这也是从公司的一个项目中获得的灵感。
原始需求
手头有一个结构简单的文本库,可以看做是key=>value。约180万条数据,2.8G(确实不算大,见笑了)。

这个库查询频繁,CPU在IOWAIT耗时颇多。
Linode服务器硬盘紧张,而CPU富裕。
若能通过压缩减小体积,备份/回导时也会更省时。

实施过程
整个实施过程做到了无缝转换,不需要停服务。

第一步:将文本字段类型由TEXT修改为BLOB;新增一个is_gzip字段用于标识是否经过压缩,默认为0。
* 需要注意,BLOB和TEXT最长支持65535字节。
第二步,修改Rails相应的Model。代码示例(压缩content字段):
class TextData < ActiveRecord::Model
def content
if self.is_gzip
Zlib::Inflate.inflate(super)
else
super
end
end

def content=(info_content)
super Zlib::Deflate.deflate(info_content, 9)
self.is_gzip = true
end
end

再一次感叹super的便捷。修改代码后,需要重新部署一下Rails应用。
第三步,创建一个rake任务,用来批量做转换。关键部位只消这么做:
text_data.content = text_data.content
text_data.save

第四步,在做过修改的表上做一次optimize [...]