我是使用 Perl 編程的新手。
我有一個 8GB 的?? zip 檔案,其中包含資料檔案和元資料檔案。目標是讀取元資料檔案的內容以與 zip 中的資料檔案名進行比較。
當前的實作是使用IO::Uncompress::Unzip,讀取元資料檔案約 60KB 需要很長時間(約 15 分鐘)。
我已經創建了一個 PoC 腳本,使用Archive::Zip::MemberRead從同一個檔案中提取資訊,并且執行速度非常快(以秒為單位)。
我擔心在我的場景中使用 Archive::Zip 有任何限制。
uj5u.com熱心網友回復:
@MiguelPrz:在我的腳本中,有步驟演練到 zip 檔案以檢索成員名稱和大小,而且速度非常快。下一步是讀取元資料檔案的內容,通過使用指定檔案名的解壓縮,它非常慢。– 樂武
無需呼叫unzip- 您可以使用IO::Uncompress::Unzip直接訪問元資料檔案。
這是一個快速作業示例,它將檢查名為 .zip 的成員的 zip 檔案metadata.txt。如果找到它,它將把內容讀入記憶體并列印出來。
首先創建一個包含名為metadata.txt.
$ echo abc >metadata.txt
$ zip test.zip metadata.txt
adding: metadata.txt (stored 0%)
現在一些代碼遍歷 zip 檔案并檢查元資料成員。
#!/usr/bin/perl
use strict;
use warnings;
use IO::Uncompress::Unzip qw($UnzipError);
my $zipfile = "test.zip";
my $u = IO::Uncompress::Unzip->new( $zipfile )
or die "Cannot open $zipfile: $UnzipError";
my $status;
for ($status = 1; $status > 0; $status = $u->nextStream())
{
my $name = $u->getHeaderInfo()->{Name};
warn "Processing member $name\n" ;
if ($name eq 'metadata.txt')
{
local $/;
my $data = <$u>;
print "METADATA is [$data]\n";
}
last if $status < 0;
}
die "Error processing $zipfile: $!\n"
if $status < 0 ;
當我運行時,我得到了這個輸出
$ perl testzip.pl
Processing member metadata.txt
METADATA is [abc
]
[全面披露——我是IO::Uncompress::Unzip]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464649.html
