ما هو الترتيب الذي يجب أن أستخدم فيه GzipOutputStream وBufferedOutputStream

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

  •  22-08-2019
  •  | 
  •  

سؤال

هل يمكن لأي شخص أن يوصي بما إذا كان ينبغي علي أن أفعل شيئًا مثل:

os = new GzipOutputStream(new BufferedOutputStream(...));

أو

os = new BufferedOutputStream(new GzipOutputStream(...));

أيهما أكثر كفاءة؟هل يجب أن أستخدم BufferedOutputStream على الإطلاق؟

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

المحلول

ما هو الترتيب الذي يجب أن أستخدمه GzipOutputStream و BufferedOutputStream

بالنسبة لتدفقات الكائنات، وجدت أن التفاف الدفق المخزن حول دفق gzip لكل من الإدخال والإخراج كان دائمًا تقريبًا بشكل كبير أسرع.كلما كانت الأشياء أصغر، كان ذلك أفضل.أفضل أو هو نفسه في جميع الحالات ثم لا يوجد تيار مخزن مؤقتًا.

ois = new ObjectInputStream(new BufferedInputStream(new GZIPInputStream(fis)));
oos = new ObjectOutputStream(new BufferedOutputStream(new GZIPOutputStream(fos)));

لكن, ، بالنسبة لتدفقات النص والبايت المستقيم، وجدت أنه كان بمثابة إهمال - حيث كان تدفق gzip حول الدفق المخزن أفضل قليلاً فقط.ولكن من الأفضل في جميع الحالات عدم وجود تيار مخزن مؤقتًا.

reader = new InputStreamReader(new GZIPInputStream(new BufferedInputStream(fis)));
writer = new OutputStreamWriter(new GZIPOutputStream(new BufferedOutputStream(fos)));

قمت بتشغيل كل إصدار 20 مرة وقطعت الجولة الأولى وقمت بحساب متوسط ​​الباقي.لقد جربت أيضًا buffered-gzip-buffered والذي كان أفضل قليلاً بالنسبة للكائنات وأسوأ بالنسبة للنص.لم ألعب بأحجام المخزن المؤقت على الإطلاق.


بالنسبة لتدفقات الكائنات، قمت باختبار ملفين من ملفات الكائنات المتسلسلة بحجم 10 ميغا بايت.بالنسبة للملف الأكبر حجمًا (38 ميجا بايت)، كان أسرع بنسبة 85% في القراءة (0.7 مقابل 5.6 ثانية) ولكنه في الواقع أبطأ قليلاً في الكتابة (5.9 مقابل 5.7 ثانية).تحتوي هذه الكائنات على بعض المصفوفات الكبيرة، مما قد يعني عمليات كتابة أكبر.

method       crc     date  time    compressed    uncompressed  ratio
defla   eb338650   May 19 16:59      14027543        38366001  63.4%

بالنسبة للملف الأصغر (18 ميجابايت)، كان أسرع بنسبة 75% في القراءة (1.6 مقابل 6.1 ثانية) وأسرع بنسبة 40% في الكتابة (2.8 مقابل 4.7 ثانية).كانت تحتوي على عدد كبير من الأشياء الصغيرة.

method       crc     date  time    compressed    uncompressed  ratio
defla   92c9d529   May 19 16:56       6676006        17890857  62.7%

بالنسبة لقارئ/كاتب النص، استخدمت ملفًا نصيًا بحجم 64 ميجابايت بتنسيق CSV.كان تدفق gzip حول التدفق المخزن أسرع بنسبة 11% للقراءة (950 مقابل 1070 مللي ثانية) وأسرع قليلاً عند الكتابة (7.9 مقابل 8.1 ثانية).

method       crc     date  time    compressed    uncompressed  ratio
defla   c6b72e34   May 20 09:16      22560860        63465800  64.5%

نصائح أخرى

ووالتخزين المؤقت يساعد عندما تكون الوجهة النهائية للبيانات هو أفضل قراءة / مكتوب في قطع أكبر من التعليمات البرمجية ستدفع على خلاف ذلك. لذلك أردت عموما التخزين المؤقت ليكون أقرب إلى قطع أكبر مكان بين أن يريد. في الأمثلة الخاصة بك، وهذا هو elided "..."، لذلك التفاف BufferedOutputStream مع GzipOutputStream. و، وضبط حجم المخزن المؤقت BufferedOutputStream لمباراة ما يعمل اختبار يظهر بشكل أفضل مع الوجهة.

وأشك في أن BufferedOutputStream في الخارج يساعد كثيرا، على كل حال، أكثر من أي التخزين المؤقت صريح. لما لا؟ سوف GzipOutputStream تفعل الكتابة بها () ليالي ل"..." في نفس الحجم قطع ما إذا كان التخزين المؤقت الخارجي موجودا أم لا. لذلك ليس هناك الأمثل ل "..." ممكن؛ كنت عالقا مع ما أحجام GzipOutputStream الكتابة () ق.

ملحوظة أيضا أن كنت تستخدم ذاكرة أكثر كفاءة من خلال التخزين المؤقت البيانات المضغوطة بدلا من البيانات غير المضغوطة. إذا كانت البيانات في كثير من الأحيان أتشيفيس ضغط 6X، المخزن المؤقت "داخل" ما يعادل وجود مخزن مؤقت 'خارج' 6X كبير مثل.

وعادة تريد منطقة عازلة بالقرب من FileOutputStream الخاص بك (على افتراض أن ما ... يمثل) لتجنب الكثير من المكالمات في نظام التشغيل والوصول إلى القرص بشكل متكرر. ومع ذلك، إذا كنت تكتب الكثير من قطع صغيرة إلى GZIPOutputStream قد تستفيد من عازلة حول GZIPOS كذلك. ويرجع سبب ذلك تتم مزامنة طريقة الكتابة في GZIPOS وأيضا يؤدي إلى بعض الاتصالات الأخرى متزامنة واثنين من مواطني (JNI) يدعو (لتحديث CRC32 والقيام ضغط الفعلي). كل هذه إضافة أحمال إضافية لكل مكالمة. حتى في هذه الحالة انا اقول لكم سوف تستفيد من كل المخازن.

وأقترح عليك محاولة معيارا بسيطا لآخر كم من الوقت يستغرق لضغط ملف كبير ومعرفة ما اذا كان يجعل الكثير من الفرق. GzipOutputStream لديها التخزين المؤقت وإنما هو عازلة أصغر. وأود أن تفعل الأول مع عازلة 64K، ولكن قد تجد أن تفعل كل من هو أفضل.

وقراءة جافادوك، وسوف تكتشف أن يستخدم BIS للتخفيف بايت قراءة من مصدر الأصلي. بمجرد الحصول على بايت الخام التي تريد ضغطها حتى تتمكن التفاف BIS مع نظم المعلومات الجغرافية. ليس هناك من معنى للتخفيف من الإخراج من GZIP، لأن يحتاج المرء إلى التفكير ماذا عن GZIP التخزين المؤقت، الذي هو ذاهب للقيام بذلك؟

new GzipInputStream( new BufferedInputStream ( new FileInputXXX
scroll top