2009-11-10 16 views
5

我使用下面的Perl代碼來列出tar檔案中的文件。 tar檔案的大小總是大約15MB。爲什麼Perl的Archive :: Tar內存不足?

my $file = shift; 
my $tar = Archive::Tar->new("$file"); 
my @lists = $tar->list_files; 
$tar->error unless @lists; 

執行此代碼給我一個錯誤「內存不足」。我的Linux系統中大約有512MB,我不想增加系統的內存。任何人都可以請建議我,如果此代碼可以修改爲更好的性能或另一個代碼列出tar檔案中的文件。

+0

國家與operting系統沿着語言使我們能從你的問題開始 – 2009-11-10 09:45:16

+0

其perl和操作系統是Linux – Space 2009-11-10 10:25:03

回答

3

我試圖在一個大的焦油上,也得到了一個錯誤。可能是libs中的一個bug。 以下爲我工作:

@files = split/\n/, `tar tf $file` 
0

如果Perl是不是必須的,使用tar

$ tar tvf file.tar 
+0

但問題是關於Perl的Archive :: Tar – Celada 2012-08-29 02:38:07

6

Archive::TarFAQ

是不是檔案::焦油慢? 是的。它是純粹的perl,所以它比/ bin/tar慢很多但是,它非常便攜。如果速度有問題,請考慮使用/ bin/tar。

是否存檔:: tar比/ bin/tar更重內存? 是的,請參閱上一個答案。由於Compress :: Zlib因此IO :: Zlib不支持在它們的文件句柄上查找,所以除了將存檔讀入內存之外別無選擇。如果您想要對存檔進行內存中操作,這沒關係。

如果您只是想提取,請改爲使用extract_archive類方法。它會立即優化並寫入磁盤。

另一種選擇是使用iter類方法遍歷tar包中的文件,而不是一次讀取所有文件。

 

因此,基於上述那麼這應該是解決方案(未經測試):

my $next = Archive::Tar->iter($file); 

while (my $f = $next->()) { 
    say $f->name; 
} 

/I3az/