【问题标题】:Rails compressing data before saving to databaseRails在保存到数据库之前压缩数据
【发布时间】:2011-08-09 02:22:44
【问题描述】:

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

我知道压缩/解压缩数据会影响性能。但是我要把解压后的数据缓存在CDN上。大多数情况下,数据不会过时几个月甚至几年。

您能否向我推荐一些好的压缩/解压缩技术?除了压缩/解压缩数据之外,我还愿意接受其他选择。

【问题讨论】:

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


    【解决方案1】:

    如果您想要一个纯 MySQL 解决方案,您可以随时尝试为您的表使用 ARCHIVE 存储类型。 The documentation 将其描述为仅插入、无更新类型的引擎,专门针对您所描述的内容,隐藏多年不会改变的东西。

    要在传统引擎中做同样的事情,需要在您的数据流上使用zlib,但请记住,压缩对已经压缩的数据(例如最流行的图像类型或视频)的性能非常差。您主要以文本形式表达您的要求,这些文本通常可以很好地压缩。

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

    要考虑的一件事是,只要您确定您的客户端支持gzip 编码,您就可以将压缩数据存储在您的 CDN 上。我不知道有哪些主流浏览器不这样做,因为资产压缩已经变得相当标准,尤其是在移动领域。

    【讨论】:

    • ZLib 选项是一种非常简洁的压缩和解压缩方式,但如果数据真的是静态的(可能几年都不会改变),那么数据库存储肯定不是最好的主意吗? Mongo 或其他文件存储解决方案或 XML 会是更好的选择,不是吗?
    • 如果你要存储很多大的东西,那么文件系统方法可能会更好,因为最小块大小导致的边际开销不会很严重。默认情况下,您始终可以将所有内容存储在 .tar.gz.gz 中。 SQLite 索引和文件系统存储将是迄今为止最便携和可扩展的。
    • 维护数据库,尤其是使用手动 XML 或不常见的引擎(如 MongoDB)制作的不规则数据库,可能会使维护变得困难。 Mongo 是一个很棒的平台,但它发展迅速,需要经常更新以保持最新状态。 SQLite 虽然没有那么全功能,但从现在起甚至可以依赖几年。
    【解决方案2】:

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

    您可以在需要时非常轻松地解压缩它们并再次压缩它们,并且在 Rails 中使用 SomeModel.to_xml 生成 XML 文件非常简单,其输出可以轻松发送到文件,因此维护它们将很简单也。你也可以反过来工作,这样在读取数据时,你可以简单地将数据转换回模型(Rails 3.x 有 ActiveModel,它非常适合这种情况,因为数据不是由数据库支持,但您仍然可以获得 ActiveRecord API 和 AR 为您提供的所有功能,这意味着您的视图、控制器等正在使用一致的 api 和一致的行为。

    您还有其他选择,例如使用 ActiveResource,但我认为这没有必要。 如果您不按照建议的方式缓存数据,则不推荐使用(顺便说一句,这是一个很好的解决方案)

    【讨论】:

    • 对不起,这是一个完全有效的答案,为什么它被否决了?肯定不是因为它有点不同?我已经明确指出,只有在数据真的是静态的并且 Rails 可以轻松处理 XML 并且它被缓存时才建议使用它,那么有什么问题?
    • XML 和 Zip 文件对于本应是简单的序列化问题的工作来说似乎是一大堆工作。
    • 真的没那么有趣,只是标准的 Rails 东西。所有 RESTfull 路由都会自动处理 XML,这很容易(使用 ActiveResource 或 ActiveRecord 以正常方式将 xml 数据恢复到应用程序内的使用状态。
    • 如果你想知道怎么做,那真的是一个完全不同的问题。只要知道它可以回答这个问题就足够了,因为除非需要解释,否则解释某些事情是没有意义的,并且任何 Rails 开发人员都应该知道这样做有多么简单。
    • 完全同意@tadman,根据公认的答案,从简单的角度来看,zlib 库绝对是最好的压缩解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2010-12-16
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多