5

以下のPerlコードを使用して、tarアーカイブ内のファイルを一覧表示しています。tarアーカイブのサイズは常に約15MBです。

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

このコードを実行すると、「メモリ不足」というエラーが発生します。Linuxシステムに約512MBありますが、システムのメモリを増やしたくありません。このコードを変更してパフォーマンスを向上させるか、別のコードを変更してtarアーカイブ内のファイルを一覧表示できるかどうかを教えてください。

4

3 に答える 3

6

FAQから:Archive::Tar

Archive :: Tarは遅いのではないですか?はい、そうです。これは純粋なperlなので、/ bin / tarよりもはるかに低速です。ただし、非常に移植性があります。速度が問題になる場合は、代わりに/ bin/tarの使用を検討してください。

Archive::Tarは/bin/ tarよりもメモリ上で重いのではないですか?はい、そうです。前の回答を参照してください。Compress :: Zlib、したがってIO :: Zlibはファイルハンドルのシークをサポートしていないため、アーカイブをメモリに読み込む以外に選択肢はほとんどありません。アーカイブのメモリ内操作を実行する場合は、これで問題ありません。

抽出するだけの場合は、代わりにextract_archiveクラスメソッドを使用してください。最適化してすぐにディスクに書き込みます。

もう1つのオプションは、iterクラスメソッドを使用して、メモリ内のすべてのファイルを一度に読み取ることなく、tarball内のファイルを反復処理することです。

 

したがって、上記に基づいて、これが解決策になるはずです(テストされていません):

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

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

/ I3az /

于 2009-11-10T12:28:08.323 に答える
3

大きなタールで試してみたところ、エラーも発生しました。おそらくライブラリのバグです。以下は私のために働いた:

@files = split/\n/, `tar tf $file`
于 2009-11-10T10:00:05.787 に答える
0

Perlが必須でない場合は、tarを使用してください

$ tar tvf file.tar
于 2009-11-10T10:35:16.047 に答える