لماذا أرشيف بيرل :: يخرج القطران من الذاكرة؟

StackOverflow https://stackoverflow.com/questions/1706565

  •  19-09-2019
  •  | 
  •  

سؤال

أنا أستخدم أدناه رمز PERL لسرد الملفات في أرشيف القطران. حجم أرشيف القطران هو دائما حوالي 15 ميغابايت.

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

تنفيذ هذا الرمز يعطيني خطأ "خارج الذاكرة". لدي حوالي 512 ميغابايت في نظام Linux الخاص بي وأنا لا أريد زيادة ذاكرة نظامي. يمكن لأي شخص يرجى اقتراح لي إذا كان يمكن تعديل هذا الرمز لأداء أفضل أو رمز آخر لإدراج الملفات في أرشيف القطران.

هل كانت مفيدة؟

المحلول

حاولت ذلك على قطران كبير وحصلت على خطأ أيضا. ربما خطأ في libs. ما يلي يعمل بالنسبة لي:

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

نصائح أخرى

من عند Archive::Tar التعليمات:

ليس الأرشفة :: قطران بطيء؟ نعم إنه كذلك. إنه بيرل نقي، لذلك فهو أبطأ بكثير ثم الخاص بك / القطر الخاص بك، إنه محمول للغاية. إذا كانت السرعة مشكلة، ففكر في استخدام / BIN / TAR بدلا من ذلك.

ليس الأرشفة :: قطران أثقل على الذاكرة من / بن / قطران؟ نعم هو، انظر الإجابة السابقة. منذ ضغط :: Zlib وبالتالي IO :: ZLIB لا يدعم البحث عن ملفاتهم، لا يوجد خيار قليل ولكن لقراءة الأرشيف في الذاكرة. هذا جيد إذا كنت تريد القيام بالمعالجة في الذاكرة للأرشيف.

إذا كنت ترغب فقط في استخراج، استخدم طريقة Castrashive Class بدلا من ذلك. سوف يتحسن والكتابة إلى القرص على الفور.

هناك خيار آخر هو استخدام طريقة فئة ITER للتكرار فوق الملفات الموجودة في Tarball دون قراءة جميعها في الذاكرة مرة واحدة.

 

على أساس أعلاه، يجب أن يكون هذا هو الحل (غير مهتم):

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

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

/ I3AZ /

إذا كان بيرل ليس أمرا لا بد منه، فاستخدم القطران

$ tar tvf file.tar
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top