سؤال

أحاول فك ضغط حوالي 8000 ملف بتنسيق gzip في Java.كانت محاولتي الأولى هي استخدام GZIPInputStream ولكن الأداء كان سيئًا.

هل يعرف أحد أي بديل لفك ضغط أرشيفات gzip؟لقد قمت بتجربة ZipInputStream لكنه لم يتعرف على تنسيق gzip.

شكرا لكم مقدما.

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

المحلول

تحتاج إلى استخدام التخزين المؤقت.إن كتابة أجزاء صغيرة من البيانات ستكون غير فعالة.يتم تنفيذ الضغط بالكود الأصلي في Sun JDK.حتى لو لم يكن الأداء المخزن مؤقتًا، فيجب عادةً أن يتجاوز الإدخال/الإخراج للملف أو الشبكة بشكل معقول.

OutputStream out = new BufferedOutputStream(new GZIPOutputStream(rawOut));

InputStream in = new BufferedInputStream(new GZIPInputStream(rawIn));

نظرًا لاستخدام التعليمات البرمجية الأصلية لتنفيذ خوارزمية فك الضغط/الضغط، كن حذرًا جدًا لإغلاق الدفق (وليس فقط الدفق الأساسي) بعد الاستخدام.لقد وجدت وجود كميات كبيرة من "المفرغين" المتسكعين جداً سيئة للأداء.

ZipInputStream يتعامل مع أرشيفات الملفات، وهو شيء مختلف تمامًا عن ضغط التدفق.

نصائح أخرى

وعندما تقول أن أداء GZipInputStream كان مروعا، هل يمكن أن يكون أكثر تحديدا؟ هل معرفة ما إذا كان عنق الزجاجة وحدة المعالجة المركزية أو / O عنق الزجاجة أنا؟ وهل تستخدم التخزين المؤقت على كل من المدخلات والمخرجات؟ إذا كنت قد نشر الشفرة التي تستخدم، من شأنه أن يكون مفيدا للغاية.

إذا كنت على آلة متعددة النوى، قد تتمكن من محاولة تزال تستخدم GZipInputStream ولكن باستخدام مواضيع متعددة، واحد لكل نواة، مع قائمة انتظار مشتركة من الملفات لا تزال لمعالجة. (لن يؤدي إلا إلى معالجة أي ملف واحد بخيط واحد.) أن <م> قد جعل أسوأ الأشياء إذا كنت I / O ملزمة، ولكن قد يكون يستحق المحاولة.

لهذا النوع من الحجم، وربما تريد أن تذهب الأم، على افتراض متطلبات النظام الأساسي الخاص بك محدودة. يمكنك استخدام JNI لاستدعاء مكتبة أو استدعاء أمر الأصلي باستخدام ProcessBuilder.

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