【问题标题】:Compress data before storage on Google App Engine在存储到 Google App Engine 之前压缩数据
【发布时间】:2010-12-16 21:47:57
【问题描述】:

我正在尝试将 30 秒的用户 mp3 录音作为 Blob 存储在我的应用引擎数据存储中。但是,为了启用此功能(App Engine 每次上传有 1MB 的限制)并降低成本,我想在上传之前压缩文件并在每次请求文件时解压缩文件。你会建议我如何完成这个(它可以通过任务队列在后台发生,但一个有效的解决方案总是好的)

根据我自己的测试和研究 - 我看到了两种可能的方法来实现这一点

  • Zlib

为此,我需要使用 While 循环一次压缩一定数量的块。但是,App Engine 不允许您写入文件系统。我考虑过使用临时文件来完成此操作,但在尝试从临时文件中解压缩内容时,我没有运气

  • 压缩包

从网上的阅读来看,应用引擎 url 获取功能似乎已经请求了 gzip 压缩的内容,然后将其解压缩。有没有办法阻止函数解压缩内容,以便我可以将其以 gzip 格式放入数据存储区,然后在需要按需播放给用户时解压缩?

让我知道您将如何建议使用 zlib 或 gzip 或其他解决方案来完成此操作。谢谢

【问题讨论】:

  • Aneto 如果你尝试压缩 MP3 它将无法工作,MP3 已经被压缩,所以比率约为 1。
  • 为什么要在 AppEngine 中存储那种文件?为什么不使用 S3 并且只有指向存储在 AppEngine 上的文件的指针?
  • 上传到 App Engine 的限制是 10MB,而不是 1 - 但数据存储区实体仍然需要不超过 1MB。

标签: python google-app-engine compression gzip zlib


【解决方案1】:

“压缩上传之前”意味着在用户的浏览器中执行此操作——但您的问题中没有任何文字可以解决这个问题!这似乎是关于压缩在您的 GAE 应用中,当然数据只会在上传之后。如果您可以开发这些扩展并说服您的用户安装它们,您可以使用 Firefox 扩展(或其他浏览器的等价物)来做到这一点,但这与 GAE 无关!-)更不用说,正如@RageZ 的评论提到,MP3本质上已经被压缩了,所以几乎没有或没有任何收获(尽管也许你可以再次为用户使用浏览器扩展,降低MP3的比特率,从而降低文件的尺寸,这可能会影响音频质量,取决于您对这些音频文件的预期用途)。

所以,总的来说,我必须支持 @jldupont 的建议(也在评论中)——使用不同的服务器来存储大文件(S3,亚马逊的产品,虽然不是唯一的,但肯定是一种可能性)。

【讨论】:

    【解决方案2】:

    虽然通过标准压缩或以较低比特率重新编码压缩 MP3 文件的技术限制(在其他答案中提到)是正确的,但您的目标是存储 30 秒的 MP3 编码数据。假设您可以对您的用户强制执行此操作,如果 MP3 比特率为 256kbit 恒定比特率 (CBR) 或更低,则无需应用额外的压缩技术就可以了。在 256kbit CBR 下,30 秒的音频需要:

    (((256 * 1000) / 8) * 30) / 1048576 = 0.91MB
    

    标准的最大比特率为 320kbit,相当于 1.14MB,因此您必须使用 256 或更少。野外最常用的比特率是 128kbits。

    还有一些额外的开销会增加最终文件的大小,例如 ID3 标签和框架,但你应该没问题。如果没有,请降至 224kbits 作为您的最大值(30 秒 = 0.80MB)。还有其他复杂性,例如可变比特率编码,其文件大小无法预测,我将忽略这些。

    所以您的问题不再是如何压缩 MP3 文件,而是如何确保您的用户知道他们不能上传超过 30 秒的 256kbits CBR 编码,以及如何执行该政策。

    【讨论】:

      【解决方案3】:
      【解决方案4】:

      正如 Aneto 在评论中提到的,您将无法使用 gzip 或 zlib 等标准压缩库来压缩 MP3 数据。但是,您可以以 MUCH 较低的比特率重新编码 MP3,可以使用LAME

      【讨论】:

        【解决方案5】:

        您最多可以使用 Blob 列表存储 10Mb。搜索google file service。 在我看来,它比 BlobStore 更通用,因为我昨天才开始使用 BlobStore Api,我仍在研究是否可以按字节访问数据.. 就像将 doc 更改为 pdf,将 jpeg 更改为 gif 一样。

        您可以存储 1Mb * 10 = 10 Mb 的 Blob(我认为的最大实体大小),或者您可以使用 BlobStore API 并获得相同的 10Mb 或在启用计费时获得 50Mb(您可以启用它,但如果您不这样做)不要通过你不支付的免费配额)。

        【讨论】:

          猜你喜欢
          • 2016-07-22
          • 1970-01-01
          • 1970-01-01
          • 2010-11-03
          • 1970-01-01
          • 2011-05-26
          • 2013-05-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多