なぜPerlのアーカイブ::タールは、メモリが不足していますか?
-
19-09-2019 - |
質問
私は、tarアーカイブ内のファイルを一覧表示するPerlコードの下に使用しています。 tarアーカイブのサイズは15メガバイト程度常にあります。
my $file = shift;
my $tar = Archive::Tar->new("$file");
my @lists = $tar->list_files;
$tar->error unless @lists;
このコードを実行すると、「メモリ不足」私にエラーを与えます。私は私のLinuxシステムでは512メガバイトについて持っていると私は私のシステムのメモリを増やしたいいけません。このコードは、より優れたパフォーマンスやtarアーカイブ内のファイルを一覧表示するために別のコードを変更することができるならば誰も私を提案してくださいすることができます。
解決
私は大タールにそれを試してみましたが、あまりにもエラーが発生しました。 LIBSでおそらくバグ。 以下は私のために働いてます:
@files = split/\n/, `tar tf $file`
他のヒント
Archive::Tar
の<のhref = "のhttpから://search.cpan。 ORG / DIST /アーカイブ・タール/ libに/アーカイブ/ Tar.pm#よくある質問」のrel = "noreferrer"> FAQ でます:
アーカイブ::タールが遅くないですか? はい、そうです。それは純粋なPerlの、それはしかし、それは非常にポータブルですあなたの/ binに/タールその後、たくさん遅くなります。速度が問題である場合は、代わりに/ binに/タールを使用することを検討します。
アーカイブ::タールは、/ binに/タールよりもメモリ上重くありませんか? はい、それは、前の回答を参照してくださいています。 Zlibのは、自分のファイルハンドルに求めてサポートしていません圧縮:: Zlibのため、IO ::ので、メモリにアーカイブを読み取るが、選択の余地があります。あなたはアーカイブのインメモリ操作をしたい場合、これはokです。
あなただけを抽出したい場合は、代わりにextract_archiveクラスのメソッドを使用します。これは、最適化し、すぐにディスクに書き込まれます。
別のオプションは、一度にメモリにすべてを読まずにtarボールのファイルを反復処理するためにITERクラスのメソッドを使用することです。
それでは、この溶液(未テスト)であるべきである、上記に基づいて
my $next = Archive::Tar->iter( $file );
while ( my $f = $next->() ) {
say $f->name;
}
/ I3az /
Perlは必須でない場合は、使用タール
$ tar tvf file.tar