Rails在保存到数据库之前压缩数据

时间:2011-08-09 02:22:44

标签: mysql ruby-on-rails ruby ruby-on-rails-3 compression

我需要将大量数据存储到数据库(MySQL)中。我希望通过在将文本数据存储到数据库之前压缩文本数据来节省磁盘空间。

我知道压缩/解压缩数据会有性能损失。但我要在CDN上缓存解压缩的数据。而且大多数情况下,数据不会在几个月甚至几年内变得陈旧。

你能告诉我一些好的压缩/解压缩技术吗?除了压缩/解压缩数据之外,我还对其他选择持开放态度。

2 个答案:

答案 0 :(得分:3)

如果您需要纯MySQL解决方案,可以尝试使用表的ARCHIVE存储类型。 The documentation将其描述为仅插入,没有更新类型的引擎专门针对您描述的内容,隐藏了多年不会发生变化的内容。

要在传统引擎中执行相同的操作,需要在数据流上使用zlib,但请记住,压缩对已压缩的数据(如最常用的图像类型或视频)执行效果非常差。您表达的要求主要是文本,通常会很好地压缩。

Ruby有Zlib::Deflate可以按需压缩和扩展数据。您可以通过在模块上实施encodedecode方法来编写类似于JSON one的自己的包装器。

要考虑的一件事是,只要您确定您的客户端支持gzip编码,您就可以将压缩数据存储在CDN上。我不知道任何主流浏览器没有,因为资产压缩已经变得非常标准,特别是在移动领域。

答案 1 :(得分:-1)

如果数据真的像你说的那样是静态的,那么将数据保存为压缩的xml文件。

你可以解压缩它们并在需要的时候再次压缩它们,并且在Rails中生成XML文件很简单,使用SomeModel.to_xml可以很容易地将其输出发送到文件中,因此维护它们将很简单太。你可以像反过来那样随意地工作,以便在阅读数据时你可以简单地将数据转换回模型(Rails 3.x有ActiveModel,这对于这种情况是理想的,因为数据不是在数据库的支持下,你仍然可以得到一个ActiveRecord API和AR给你的所有果汁意味着你的视图,控制器等正在使用一致的api和一致的行为。

您还有其他选项,例如使用ActiveResource但我不认为这是必要的。 如果您不以您建议的方式缓存数据(这是一个简洁的解决方案BTW),这不是推荐的方法