জিজিপ ফাইলগুলিকে দক্ষতার সাথে bzip2 এ রূপান্তর করা


10

আমার কাছে গুচ্ছ জিপ ফাইল রয়েছে যা আমাকে এখন থেকে bzip2 তে রূপান্তর করতে হবে। বর্তমানে, আমি একটি শেল স্ক্রিপ্ট ব্যবহার করছি যা কেবল 'প্রতিটি ফাইলের গানজিপ এবং তারপরে' bzip2 এর। যদিও এটি কাজ করে, এটি সম্পূর্ণ করতে অনেক সময় লাগে ।

এই প্রক্রিয়া আরও কার্যকর করা সম্ভব? আমি ডুব নেওয়ার জন্য এবং প্রয়োজনে বন্দুক এবং বিজিপ 2 এর উত্স কোডগুলি সন্ধান করতে প্রস্তুত, তবে আমি কেবল পরিশোধের বিষয়ে নিশ্চিত হতে চাই। প্রক্রিয়াটির দক্ষতা বাড়ানোর কোনও আশা আছে কি?

উত্তর:


1

এই প্রশ্নটি অনেক আগে জিজ্ঞাসা করা হয়েছিল যখন pbzip2 হয় উপলব্ধ ছিল না বা স্টিডিন থেকে সংক্ষেপণ করতে সক্ষম ছিল না, তবে আপনি এখন সমান্তরাল এবং pbzip2 ( বিজিপ 2 এর পরিবর্তে ) ব্যবহার করে সংক্ষেপিত এবং সংক্ষেপণ উভয় পদক্ষেপকে সমান্তরাল করতে পারেন :

ls *.gz | parallel "gunzip -c {} | pbzip2 -c > {.}.bz2"

যা bzip2 ব্যবহার করার চেয়ে উল্লেখযোগ্যভাবে দ্রুত ।


হাই, আমি এটির গ্রহণযোগ্য উত্তরটি পরিবর্তন করেছি যেহেতু এটি আজকের প্রশ্নে হোঁচট খাওয়ার পক্ষে সর্বোত্তম বিকল্প দেয়। pbzip2উল্লেখ করার জন্য ধন্যবাদ । লিঙ্কটি অন্য কারও জন্য লোড না হলে প্রজেক্ট পৃষ্ঠা এবং ম্যান পৃষ্ঠাটি এখানে রয়েছে
- মনিকা

15

এক ধাপে গানজিপ এবং অন্যটিতে bzip2 পরিবর্তে পাইপগুলি ব্যবহার করার ক্ষেত্রে এটি আরও দক্ষ হবে কিনা তা অবাক করি। কিছুটা এইরকমgunzip --to-stdout foo.gz | bzip2 > foo.bz2

আমি দুটি বা আরও বেশি সিপিইউ নিয়ে ভাবছি, এটি অবশ্যই দ্রুততর হবে। তবে সম্ভবত শুধুমাত্র একটি একক কোর দিয়ে। যদিও লজ্জাজনকভাবে আমি এটি চেষ্টা করেও স্বীকার করি নি।


2
পাইপিংয়ের জন্য +1, ডিস্ক I / O এমন একটি জিনিস যা আপনি এড়াতে চান। সংকোচন হিসাবে, আমি ভুল করছি, যদি না, bzip2 সমান্তরাল নয়। সমান্তরালে সংকোচনের জন্য আপনাকে pbzip2 এর মতো কিছু ব্যবহার করতে হবে: সংক্ষেপণ।
Ca

... এবং দুর্ভাগ্যক্রমে, সেখানে কোনও সমান্তরাল জিপ জিপ ডিকম্প্রেশন ইউটিলিটি উপলব্ধ বলে মনে হচ্ছে না।
gustafc

@ গুস্তাফ্যাক: পিবিজিপ 2-র লিঙ্কের জন্য ধন্যবাদ, এটি খুব সহায়ক ছিল ... @ ওপ: আমি পাইপ বিসিওগুলি পাইপ করা থেকে দূরে সরে এসেছি, পাইপগুলিতে না হারিয়ে আমি দুর্নীতিগ্রস্থ জিজেড ফাইলগুলি মোকাবেলা করতে সক্ষম হতে চাই ...
সূন্দর - মনিকা

4
@gustafc: এমনকি যদি bzip2এবং gzipঅভ্যন্তরীণভাবে সমান্তরাল কাজ করে না, একটি নল ব্যবহার করে আপনি সমান্তরাল তাদের কাজ, কারণ একটি নল পরোক্ষভাবে দুই প্রক্রিয়ার, যা শুরু হয় থাকতে পারে হবে সমান্তরালভাবে চালানো। সুতরাং কমপক্ষে ডিকম্প্রেশন এবং সংক্ষেপণ সমান্তরালে চলবে।
স্লেসকে

1
@ স্লেসকে, যদিও আপনি তত্ত্বের ক্ষেত্রে ঠিকই আছেন, তবে bzip2সিপিইউ ব্যবহারটি gunzipএকটিকে বামন করে তোলে, তাই অনুশীলনে আপনি এখানে যে সমান্তরালতা পান তা ন্যূনতম। ডিস্ক আইও না করা এখনও দুর্দান্ত!
জোহান ওয়ালস

6

আপনার একাধিক কোর (বা এমনকি একাধিক মেশিন) থাকলে GNU সমান্তরাল ( http://www.gnu.org/software/parallel ) একটি বিকল্প হতে পারে:

ls *.gz | parallel "gunzip -c {} | bzip2 > {.}.bz2"

বিশদ এবং বিকল্পগুলির জন্য টিউটোরিয়াল / ম্যান পৃষ্ঠা পড়ুন।


3

আপনি বর্তমানে যা করছেন তা হ'ল আপনার সেরা বাজি। কোনও রূপান্তর সরঞ্জাম উপলব্ধ নেই, এবং ইতিমধ্যে gzipped ফাইলটি bzip2 করার চেষ্টা করা আসলেই কোনও বিকল্প নয়, কারণ এটির ঘন ঘন অনাকাঙ্ক্ষিত প্রভাব রয়েছে। যেহেতু অ্যালগরিদম আলাদা, রূপান্তরকরণে নির্বিশেষে মূল ডেটা পুনরুদ্ধার করা জড়িত। অবশ্যই জিজিপিং bzip2 প্রক্রিয়াটির একটি পদক্ষেপ ছিল, এটি দুর্ভাগ্যক্রমে নয়।


অ্যালগরিদমের এমন কোনও ওভারল্যাপিং পদক্ষেপ নেই যা আমি জিপ-ডিকম্প্রেশন এবং বিজিপ সংকোচনেও একই পদক্ষেপ এড়াতে পারি?
- মনিকা পুনরায় ইনস্টল করুন 19:59

2
@ সুন্দর আমি এটি ভাবব না। gzipলিম্পেল-জিভ 77 bzip2ব্যবহার করে , যখন বুরোস-হুইলারের ব্যবহার করে। বিভিন্ন অ্যালগরিদম, আমি ভয় করি।
new123456

2

মাঝে মাঝে লগ ফাইলগুলির সাথে আমারও একই কাজ করা দরকার। আমি প্রথমে ক্ষুদ্রতম * .gz ফাইলগুলি ( ls -rS), গানজিপ এবং তারপরে শুরু করি এবং সেগুলি পৃথকভাবে bzip2 করি। আমি জানি না যে সরাসরি বিজিপ 2 ইনপুটটিতে গানজিপ আউটপুট পরিচালনা করা সম্ভব কিনা। Bzip2 কমান্ডটি কমপ্রেস করার চেয়ে গঞ্জজিপের চেয়ে কম গতিতে কম হয় যে এটি হোস্টের মেমরি এবং অদলবদল গ্রাস করতে পারে।

উন্নতি বা পরামর্শ স্বাগত। এখানে আমার এক লাইনার:

for i in $(ls -rS *.gz | sed 's/\.gz//'); do gunzip ${i}.gz; bzip2 -9 ${i}; done

ইনপুটটির জন্য ধন্যবাদ, দুটি প্রক্রিয়া এবং এর সাথে জড়িত হওয়ার গতির পার্থক্যের বিষয়ে গুরুত্বপূর্ণ বিষয়টি।
- মনিকা

1

আপনার যদি কয়েকটিরও বেশি থাকে, একটি দুর্দান্ত শেল স্ক্রিপ্ট সহ এলজে নিবন্ধটি দেখুন।

http://linuxgazette.net/123/bechtel.html

7 জিপ আরও ভাল কম্প্রেশন পায়, এবং এটি মাল্টি থ্রেডেড।


1

কয়েক মিনিট আগে এটি করতে হয়েছিল:

find . -name "*.gz" | perl -pi -e 's/\.gz$//g;' | xargs -n1 ./rezip

কোথায় rezipসংজ্ঞায়িত করা হবে:

#!/bin/bash
gunzip -v $1.gz && bzip2 -9v $1

Allyচ্ছিকভাবে, আপনি এটির -Pসাথে একটি বিকল্প ব্যবহার করে এটি বহু-থ্রেডও করতে পারেন xargs, তবে সেই সাথে সতর্ক হন careful (কম শুরু করুন!)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.