2009-11-03 41 views

回答

5

如果执行二进制unzip,你的进程会fork/exec和

  1. 实例化一个新的进程
  2. 占用更多的内存(用于衍生进程的持续时间)

你还必须配置正确的路径到unzip。鉴于这一切,我强烈希望图书馆的方法。

+3

我从来不理解这种想法。 fork/exec是一个非常快速的过程,任何花时间阅读或编写shell脚本的人都会意识到这一点。解压缩二进制本身消耗的内存相对于算法和(特别是)其中的数据成本而言是微不足道的。并且/ usr/bin/unzip默认在每个Linux发行版上发布,我也相信BSD和Cygwin。 除非你有如下简单的示例代码:'open my $ input“,unzip -cp $ ARCHIVE $ FILE |”',我宁愿选择简单的选项。 – 2009-11-03 17:47:19

+1

虽然我同意上面的*一般*,如果您的服务器负载很重,那么您的资源消耗将会随着fork/exec模型的增加而增加。 pid分配,进程间流分配,内存分配(允许写入时复制)。对于独立进程,我很满意fork/exec模型。对于服务器模型,我更愿意以最少的资源分配来回避这种模式。 – 2009-11-03 18:05:51

+1

如果你在一个循环中分支,特别是一个热循环,你绝对会看到性能问题。如果你不在循环中,或者如果你以每秒一次或每几秒一次的速度分叉,那么没问题。另外,使用库而不是系统的'unzip'命令可能是一个好处;图书馆可能会更新,更少车。 – 2013-04-11 04:47:23

14

按照Archive::Zip documentation你会更好使用Archive::Extract

如果你只是要建议您看看使用存档提取拉链(和/或其他档案)::提取物相反,因为它更容易使用,并归因于存档特定的功能。

这很有趣,因为Archive::Extract will try Archive::Zip first and then fall back to the unzip binary if it fails.所以看起来Archive :: Zip似乎是首选。

Archive :: Zip使用Compress::Raw::Zlib这是zlib系统库的低级接口;所以它不是纯粹的Perl实现,这意味着它的性能与unzip相似。换句话说,从性能角度来看,没有理由在Archive :: Zip之前选择unzip

+3

如果使用'Archive :: Extract',那么它也适用于其他压缩格式。 – 2009-11-03 17:24:54

1

一个问题是内存。我们发现Archive::Tar存在内存泄漏的难题(生产Web服务器崩溃)。因此,尽管整体使用模块而不是系统调用外部命令是一个好主意(请参阅其他推理的回复),但您需要确保模块没有陷阱。

相关问题