【问题标题】:Rubyzip and zipruby for zip/unzip not creating much difference in the compressed zipfile size用于 zip/unzip 的 Rubyzip 和 zipruby 不会在压缩的 zipfile 大小上产生太大差异
【发布时间】:2013-09-27 06:37:58
【问题描述】:

我一直在使用rubyzip 压缩/解压缩 20MB 到 1GB 的文件/文件夹。我注意到在压缩 20MB 的文件夹后,创建的 zipfile 的大小几乎相同,大约为 20MB。@987654322 也是如此@ 只是压缩文件或实际压缩它,因为压缩文件必须小于实际文件大小的 40%-50%。我什至尝试使用 system(zip, archive, Dir["#{path}/**/**"]) 但我想我无法获得正确的语法来调用它。所以我的问题是

  1. 为什么rubyzip 无法创建实际的 zip 文件,该文件的大小也必须更小。
  2. 对于超过 500MB 的 zip 文件,我如何使用 send_file 将其发送给客户端,因为对于该大小的文件,它会带来成本性能问题。如果我将 500MB 或以上的 zip 文件放在公共文件夹中并让服务器为其提供服务,这可能会提高性能,对吗?
  3. 除了使用rubyzip/zipruby(这也需要库)之外,还有其他选择吗。

我正在使用 ruby​​ 1.9 和 rails 2.3。

我的代码:-

require 'zip/zip'
require 'fileutils'
require 'zip/zipfilesystem'


def self.compress_test(path)

    path="#{RAILS_ROOT/answers/}"  
     path.sub!(%r[/$],'')
     archive = File.join(path,File.basename(path))+'.zip'
     FileUtils.rm archive, :force=>true
     Zip::ZipFile.open(archive, 'w') do |zipfile|
       Dir["#{path}/**/**"].reject{|f|f==archive}.each do |file|
             begin  
                 zipfile.add(file.sub(path+'/',''),file)   
             rescue Zip::ZipEntryExistsError
             end
       end
     end
 end

【问题讨论】:

  • 压缩率取决于文件的类型。总大小为 20MB 的文件夹中有哪些类型的文件?
  • 文件夹结构是这样的 parent/child1 child2 等等,最多 100 个,子文件夹的文件可以是 xls、zip、txt 文件,其中一个父文件夹将有一个集合 o 文件夹每个大约 3-5MB。
  • 如果压缩 zip 文件的文件夹,生成的文件不会变小。
  • 感谢 Neil 的快速回复。它并不总是会有 zip 文件。我创建了一个包含静态图像的文件夹,xls 文件进行测试,但使用上述代码压缩后,zip 的大小为几乎一样。
  • xls 文件应该压缩一点(可能压缩到原始文件的 50%),但 jpgpnggif 不会(它们已经在里面压缩了,你会得到99% 原始大小或类似大小)- 图像通常比电子表格文件大,因此您可能不会注意到总文件大小。

标签: ruby-on-rails ruby ruby-on-rails-3 zip rubyzip


【解决方案1】:

为什么 ruby​​zip 无法创建一个实际的 zip 文件,它的大小也必须更小。

这取决于您要压缩的文件。文本和 xls 文件将压缩得相当好。 JPEG、PNG、MPEG 等格式的媒体文件已经在内部进行了压缩,并且通常获得 99% 的压缩率。它们通常比同一文件夹中的其他文件要大,因此压缩包含一些图像、文本和电子表格的文件夹的结果似乎不会小很多。压缩.zip 文件甚至可以使最终结果比开始时更大

对于超过 500MB 的 zip 文件,我如何使用 van 将其发送到客户端 send_file 因为它的文件的成本性能问题 那大小。如果我将 500MB 或以上的 zip 放在公共文件夹中会怎样 让服务器为它服务,这可能会提高性能,我是 对吗?

是的,将大文件保存到磁盘并让 Web 服务器发送它可能更有效。最简单的做法是将文件保存到可以从中获取文件的文件夹中,并提供链接。您也可以从不同的服务器(例如,专门用于提供大文件的 lighttpd 实例)来避免加载您的应用程序服务器。

有一些设置允许您将控制权从 Ruby 进程传回给例如Apache(xsendfile 是我所知道的),但设置它是一个不同的问题,这取决于您拥有的 Web 服务器,以及您是否有安全问题。

除了使用 ruby​​zip/zipruby(哪个 也需要库)。

可能是的,但是您不太可能通过更改您正在使用的 gem 来解决其他两个问题,因为 rubyzip 在这里做得很合理 - 它没有失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    相关资源
    最近更新 更多