Le *_* Vu 2 compression perl zip
我是 Perl 编程新手。
我有一个 8GB 的 zip 文件,其中包含数据文件和元数据文件。目标是读取元数据文件的内容以与 zip 中的数据文件名进行比较。
当前的实现是使用IO::Uncompress::Unzip,读取元数据文件 ~60KB 需要很长时间(~15 分钟)。
我使用 创建了一个 PoC 脚本Archive::Zip::MemberRead,从同一文件中提取信息,并且执行速度非常快(以秒为单位)。
我担心的是在我的场景中使用 Archive::Zip 是否存在任何限制。
\n\n@MiguelPrz:在我的脚本中,有一个 zip 文件的逐步演练,用于检索成员名称和大小,而且速度相当快。下一步是读取元数据文件的内容,通过使用指定文件名解压,速度非常慢。\xe2\x80\x93\nLe Vu
\n
无需调用unzip- 您可以IO::Uncompress::Unzip直接访问元数据文件。
这是一个快速运行的示例,它将检查名为 的成员的 zip 文件metadata.txt。如果找到,它将把内容读入内存并打印出来。
首先创建一个测试 zip 文件,其中包含名为 的成员metadata.txt。
$ echo abc >metadata.txt\n$ zip test.zip metadata.txt \n adding: metadata.txt (stored 0%)\nRun 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 ;\nRun Code Online (Sandbox Code Playgroud)\n当我运行它时,我得到这个输出
\n$ perl testzip.pl\nProcessing member metadata.txt\nMETADATA is [abc\n]\nRun Code Online (Sandbox Code Playgroud)\n[完全披露——我是作者IO::Uncompress::Unzip]