Archive::Zip 和 IO::Uncompress::Unzip 之间有什么区别

Le *_* Vu 2 compression perl zip

我是 Perl 编程新手。

我有一个 8GB 的​​ zip 文件,其中包含数据文件和元数据文件。目标是读取元数据文件的内容以与 zip 中的数据文件名进行比较。

当前的实现是使用IO::Uncompress::Unzip,读取元数据文件 ~60KB 需要很长时间(~15 分钟)。

我使用 创建了一个 PoC 脚本Archive::Zip::MemberRead,从同一文件中提取信息,并且执行速度非常快(以秒为单位)。

我担心的是在我的场景中使用 Archive::Zip 是否存在任何限制。

pmq*_*mqs 5

\n

@MiguelPrz:在我的脚本中,有一个 zip 文件的逐步演练,用于检索成员名称和大小,而且速度相当快。下一步是读取元数据文件的内容,通过使用指定文件名解压,速度非常慢。\xe2\x80\x93\nLe Vu

\n
\n

无需调用unzip- 您可以IO::Uncompress::Unzip直接访问元数据文件。

\n

这是一个快速运行的示例,它将检查名为 的成员的 zip 文件metadata.txt。如果找到,它将把内容读入内存并打印出来。

\n

首先创建一个测试 zip 文件,其中包含名为 的成员metadata.txt

\n
$ echo abc >metadata.txt\n$ zip test.zip metadata.txt \n  adding: metadata.txt (stored 0%)\n
Run Code Online (Sandbox Code Playgroud)\n

现在有一些代码遍历 zip 文件并检查元数据成员。

\n
#!/usr/bin/perl\n\n\nuse strict;\nuse warnings;\n\nuse IO::Uncompress::Unzip qw($UnzipError);\n \nmy $zipfile = "test.zip";\nmy $u = IO::Uncompress::Unzip->new( $zipfile )\n    or die "Cannot open $zipfile: $UnzipError";\n \nmy $status;\nfor ($status = 1; $status > 0; $status = $u->nextStream())\n{\n    my $name = $u->getHeaderInfo()->{Name};\n    warn "Processing member $name\\n" ;\n \n    if ($name eq 'metadata.txt')\n    {\n        local $/;\n        my $data = <$u>;\n        print "METADATA is [$data]\\n";\n    }\n\n    last if $status < 0;\n}\n \ndie "Error processing $zipfile: $!\\n"\n    if $status < 0 ;\n
Run Code Online (Sandbox Code Playgroud)\n

当我运行它时,我得到这个输出

\n
$ perl testzip.pl\nProcessing member metadata.txt\nMETADATA is [abc\n]\n
Run Code Online (Sandbox Code Playgroud)\n

[完全披露——我是作者IO::Uncompress::Unzip]

\n