জিজিপ সংক্ষেপণ কেন ডেটারের নকল খণ্ডনগুলি দূর করে না?


30

আমি কেবলমাত্র একটি সামান্য পরীক্ষা করেছি যেখানে ডুপ্লিকেট ফাইলগুলি সহ একটি টার আর্কাইভ তৈরি করেছি এটি দেখার জন্য এটি আমার সংক্ষেপে সংকুচিত হবে কি না! বিশদগুলি অনুসরণ করে (পড়ার আনন্দের জন্য ফলাফল যুক্ত):

$ dd if=/dev/urandom bs=1M count=1 of=a
  1+0 records in
  1+0 records out
  1048576 bytes (1.0 MB) copied, 0.114354 s, 9.2 MB/s
$ cp a b
$ ln a c
$ ll
  total 3072
  -rw-r--r-- 2 guido guido 1048576 Sep 24 15:51 a
  -rw-r--r-- 1 guido guido 1048576 Sep 24 15:51 b
  -rw-r--r-- 2 guido guido 1048576 Sep 24 15:51 c
$ tar -c * -f test.tar
$ ls -l test.tar 
  -rw-r--r-- 1 guido guido 2109440 Sep 24 15:51 test.tar
$ gzip test.tar 
$ ls -l test.tar.gz 
  -rw-r--r-- 1 guido guido 2097921 Sep 24 15:51 test.tar.gz
$ 

প্রথমে আমি 1MiB ফাইল এলোমেলো ডেটা তৈরি করেছি (ক)। তারপরে আমি এটিকে একটি ফাইল বিতে অনুলিপি করলাম এবং এটিকে সিটিতেও সংযুক্ত করেছি। টার্বলটি তৈরি করার সময়, টারলালটি স্পষ্টতই হার্ডলিঙ্ক সম্পর্কে অবগত ছিল, যেহেতু টারবালটি কেবলমাত্র ~ 2MiB এবং 3Mib নয়।

এখন আমি জিজিপটি প্রত্যাশা করেছি যে টারবলের আকার হ্রাস করে ~ 1MiB করা হবে যেহেতু a এবং b এর নকল রয়েছে, এবং টারবলের ভিতরে 1MiB ধারাবাহিক তথ্য পুনরাবৃত্তি করা উচিত, তবুও এটি ঘটেনি।

কেন? এবং এই ক্ষেত্রে আমি কীভাবে দক্ষতার সাথে টারবালকে সংকুচিত করতে পারি?

উত্তর:


24

জিজিপ জিজিপ ডিফল্ট অ্যালগরিদমের উপর ভিত্তি করে তৈরি করা হয় যা এলজেড 7777 এবং হাফম্যান কোডিংয়ের সংমিশ্রণ। এটি একটি ক্ষতিহীন ডেটা সংক্ষেপণ অ্যালগরিদম যা অন-ফ্লাই-তে নির্মিত অভিধান ব্যবহার করে ডুপ্লিকেটগুলি দেখার জন্য ইনপুট স্ট্রিমকে সংকুচিত চিহ্নগুলিতে রূপান্তর করে কাজ করে। তবে এটি 32 কে-র বেশি আলাদা করে সদৃশ খুঁজে পাবে না। এটির সদৃশ 1MB সদৃশ হওয়ার প্রত্যাশা করা বাস্তবসম্মত নয়।


যথেষ্ট ফর্সা! স্ট্রিমে কাজ করে না এমন কোনও বিকল্প সম্পর্কে আপনি কি জানেন?
Guido

1
আপনার সমস্যার কোনও প্যাকেজড সমাধান আমি জানি না। যদি আমি প্রত্যাশা করেছিলাম এটি একটি পুনরাবৃত্তিযোগ্য, গুরুতর সমস্যা হবে তবে আমি (ব্যক্তিগতভাবে) এটি কোনও স্ক্রিপ্ট দিয়ে আক্রমণ করব যা ডুপ্লিকেটগুলি অনুসন্ধান করার জন্য এন-ওয়ে সিএমপি (তুলনা) অপারেশন করেছিল, একটি ফাইলের জন্য তালিকাটি লিখবে, তারপরে কেবল ট্যার + জিজিপ অনন্য আইটেম + তালিকা। পুনরুদ্ধার করতে, আমি ইউএনজিপ এবং আনটারে দ্বিতীয় স্ক্রিপ্ট ব্যবহার করব, তারপরে তালিকা থেকে ডুপস তৈরি করব। অন্য বিকল্প হ'ল ডুপগুলি হার্ড লিঙ্কগুলিতে পরিণত করা, যেহেতু আপনি জানেন যে টারগুলি সেগুলিকে চিহ্নিত করে। দুঃখিত, আমি জানি এটি সম্ভবত আপনি আশা করছেন না not
নিকোল হ্যামিল্টন

1
gzip এবং bzip2 উভয়ই তাদের নকশার কারণে তুলনামূলকভাবে "স্ট্রিম বান্ধব" হতে হবে - পাইপের অংশ হিসাবে কাজ করতে সক্ষম হওয়া একেবারে প্রয়োজনীয়। আপনি এখানে যা খুঁজছেন তা হ'ল প্রকৃত প্রতিলিপি এবং কেবল সংক্ষেপণ নয়। যেহেতু টারটি প্রক্রিয়াটিকে দুটি ভাগে বিভক্ত করে - কেবলমাত্র টারের সাহায্যে সংরক্ষণাগারভুক্ত করে এবং তারপরে সংক্ষেপণের জন্য ফিল্টার হিসাবে দ্বিতীয় প্রোগ্রামটি ব্যবহার করে। আমি আমার অনুসন্ধানগুলিতে সদৃশ সহ কোনও সংকুচিত সংরক্ষণাগারটি খুঁজে পেলাম না, তবে আমি পূর্ববর্তী সম্পর্কিত এই প্রশ্নটি পেয়েছি। superuser.com/questions/286414/…
স্টেফানি


1
@ গুইডো অবশ্যই কোনও প্রবাহের মধ্যে এটি মনে রাখে না এমন কিছুর সদৃশ কিছু মুছে ফেলতে পারে না, তবে এর মতো কিছু xz -9 -M 95%বা এমনকি চেষ্টা করুন xz -M 95% --lzma2=preset=9,dict=1610612736। এটি দ্রুত হবে না, তবে ফলস্বরূপ আপনার সদৃশগুলি বাম হওয়ার সম্ভাবনা নেই।
এয়ারোনে

39

নিকোল হ্যামিল্টন সঠিকভাবে নোট করেছেন যে gzipএর অভিধানের ছোট আকারের কারণে দূরের সদৃশ ডেটা পাবেন না।

bzip2 অনুরূপ, কারণ এটি 900 কিলোমিটার মেমরির মধ্যে সীমাবদ্ধ।

পরিবর্তে, চেষ্টা করুন:

LZMA / LZMA2 অ্যালগরিদম ( xz, 7z)

এলজেডএমএ অ্যালগরিদম ডিফল্টের মতো একই পরিবারে রয়েছে তবে এটি একটি বৃহত্তর অভিধানের আকার ব্যবহার করে (অনুকূলিতযোগ্য; ডিফল্টটি 384 এমবি এর মতো কিছু)। xzউপযোগ, যা সাম্প্রতিকতম লিনাক্স ডিস্ট্রো ডিফল্টরূপে ইনস্টল করা উচিত, অনুরূপ gzipএবং LZMA ব্যবহার করে।

যেহেতু এলজেডএমএ দীর্ঘতর পরিসরের রিডানডেন্সি সনাক্ত করে, এটি আপনার ডেটা এখানে নকল করতে সক্ষম হবে। তবে এটি জিজিপের চেয়ে ধীর।

আরেকটি বিকল্প 7-জিপ (হয় 7z, এ p7zipপ্যাকেজ), যা একটি আর্কাইভার (বরং একটি একক-স্ট্রীম সংকোচকারী চেয়ে) হল ডিফল্ট (LZMA লেখক দ্বারা লিখিত) দ্বারা LZMA ব্যবহার করে। 7-জিপ আর্কিভার তার .7zফর্ম্যাটে সংরক্ষণাগারভুক্ত করার সময় ফাইল স্তরে (একই এক্সটেনশানযুক্ত ফাইলগুলির দিকে তাকিয়ে থাকে) তার নিজস্ব প্রতিলিপি চালায় । এর অর্থ এই যে আপনি যদি এটির tarসাথে প্রতিস্থাপন করতে চান তবে আপনি 7zঅভিন্ন ফাইলগুলি প্রতিলিপি পাবেন। তবে 7z ন্যানোসেকেন্ডের টাইমস্ট্যাম্পগুলি, অনুমতিগুলি বা xattrs সংরক্ষণ করে না, তাই এটি আপনার প্রয়োজনের সাথে খাপ খায় না।

lrzip

lrzipএকটি সংকোচকারী যা জিজিপ / ডিফলেট, বিজিপ 2, এলজপ, বা এলজেডএমএর মতো প্রচলিত অ্যালগরিদমকে খাওয়ানোর আগে লম্বা-দূরত্বের অপ্রয়োজনীয়তা দূর করার জন্য ডেটা প্রিক্রোসেস করে। আপনি এখানে যে নমুনা ডেটা দেন সেটি জন্য, এটি প্রয়োজনীয় নয়; যখন ইনপুট ডেটা মেমরিতে ফিট করতে পারে তার চেয়ে বড় হয় তখন এটি কার্যকর।

এই ধরণের ডেটা (অনুলিপি সঙ্কলিত অংশগুলি) এর জন্য আপনার সাথে lzopসংক্ষেপণ (খুব দ্রুত) ব্যবহার করা উচিত lrzip, কারণ এটি অনুলিপি হয়ে যাওয়ার পরে সম্পূর্ণরূপে এলোমেলো তথ্য সংকোচনের জন্য আরও কঠোর চেষ্টা করার কোনও সুবিধা নেই।

বুপ এবং ওব্নম

আপনি প্রশ্ন বাঁধা যেহেতু , যদি এখানে আপনার লক্ষ্য ডেটা ব্যাক আপ করা হয়, মত একটি deduplicating ব্যাকআপ প্রোগ্রাম ব্যবহার বিবেচনা ইউনিভার্সিটি অব প্রফেশনালস বা Obnam


এই lrzip আকর্ষণীয় দেখাচ্ছে। এমনকি এটিতে অপ্রচলিত সমাধানগুলির জন্য পরিচিত লেখকও রয়েছে। এখন আমাকে আমার ব্যাকআপ স্ক্রিপ্টগুলি সংশোধন করতে হবে। আবার।
0:56

3
+1 বাহ, সেখানে জ্ঞান / অভিজ্ঞতার ঝর্ণা। প্রশংসা করেন। আমি কি মিশ্রণে ডেডআপ সক্ষম ফাইল ফাইলগুলি যুক্ত করতে পারি? জেডএফএস (এবং, আমি মনে করি
বিটিআরএফএস

7Zip LZMA2 সংক্ষেপণ এবং একটি 1536Mb ডিকশনারি আকার (উইন্ডোজ জিইআইতে সর্বাধিক আকার উপলব্ধ) আমার জন্য দুর্দান্ত কাজ করে!
লিওপোলোডো সান্জিক

2

ব্যাকআপের ক্ষেত্রে, সম্ভবত ছোট ফাইলগুলির একটি বড় সেট সহ, আপনার জন্য কাজ করতে পারে এমন একটি কৌশলটি এক্সটেনশান দিয়ে টারে ফাইলগুলিকে সাজিয়ে তোলা:

find archive_dir -type f | rev | sort | rev | tar czf my_archive.tar.gz -I -

আমি সমস্ত revগুলো কেটে ফেলেছি (কেন এমনকি বিপরীত এবং তারপরও সাজান?) এবং "-r, --revers"sort বিকল্পটি দেখুন (যদিও আমি নিশ্চিত না কেন আপনি কোনও বিপরীত কেন চান)। তবে আমি মনে করি আপনার বিকল্পটি " " আপনি যা ভাবেন এটি করেন না " " , আপনি সম্ভবত "-T,tar-I-I, --use-compress-program PROG
ফাইলগুলি

আমি বিশ্বাস করি এটি | tar czf my_archive.tar.gz -I -হওয়া উচিত| xargs tar Azf my_archive.tar.gz
অলিভিয়ার ডুলাক

@ Xen2050, revপ্রতিটি লাইনের অক্ষরের ক্রমকে বিপরীত করে, প্রবাহে রেখার ক্রম নয়। এ কারণে, sortফাইলগুলি তাদের এক্সটেনশান দ্বারা গ্রুপ করুন। আমার সন্দেহ হওয়া -I -উচিত ছিল -T -যা স্টিডিনে ফাইল তালিকা সরবরাহ করে।
বিলিজেএমসি

@ বিলিজেএমসি আমি দেখতে পাচ্ছি, এটি revপ্রকারের দ্বারা সম্প্রসারণের ব্যবস্থা করবে, তা নয় যে লিনাক্সে যাইহোক অনেকগুলি এক্সটেনশন রয়েছে। আমি ধারণা করতাম আকারের অনুসারে বাছাই করার ক্ষেত্রে
ডুপের সন্ধানের

2

gzipডুপ্লিকেটগুলি খুঁজে পাবেন না, এমনকি xzএকটি বিশাল অভিধানের আকারও পাবেন না। আপনি যা করতে পারেন তা হ'ল ব্যবহার mksquashfs- এটি সত্যই ডুপ্লিকেটের স্থান সংরক্ষণ করবে।

তিনটি এলোমেলো বাইনারি ফাইল (M৪ এমবি) সহ xzএবং এর mksquashfsসাথে কয়েকটি দ্রুত পরীক্ষার ফলাফল রয়েছে যার মধ্যে দুটি দুটি একই:

সেটআপ:

mkdir test
cd test
dd if=/dev/urandom of=test1.bin count=64k bs=1k
dd if=/dev/urandom of=test2.bin count=64k bs=1k
cp test{2,3}.bin
cd ..

স্কোয়াশএফএস:

mksquashfs test/ test.squash
> test.squash - 129M

ভাবে xZ লস:

XZ_OPT='-v --memlimit-compress=6G --memlimit-decompress=512M --lzma2=preset=9e,dict=512M --extreme -T4 ' tar -cJvf test.tar.xz test/
> test.tar.xz - 193M

Mksquashfs কেবল ফাইল-স্তরে ডুপ্লিকেটগুলি খুঁজে পায়, বা এটি ছোট অংশগুলিতেও কাজ করে? তা হ'ল: এটিও কি একই ফাইলগুলিকে সামান্য-ভিন্ন-তবে-বেশিরভাগ-একই ফাইল সংকোচিত করবে?
বিশৃঙ্খলা_99

এটি কেবল একটি ফাইল-ভিত্তিতে আফাইক কাজ করে। আপনি দেখতে পাচ্ছেন যে এই তিনটি টেস্ট-ফাইলগুলিকে নন-সংকুচিত টার আর্কাইভে সংরক্ষণ করার পরে এবং পরে mksquashfs দিয়ে সংকুচিত করার সময়। অন্যদিকে, স্টকআউটে ডুপ্লিকেটগুলি সন্ধান করার সময়, ম্যাক্সক্যাশফগুলি প্রতিবেদন করবে Number of duplicate files found
ইজজি

1

আমার সিস্টেমে lzma test.tar106'3175 বাইট (1.1M) test.tar.lzma ফাইলের ফলাফল


1

'যান্ত্রিক শামুকের উত্তরের যোগ হিসাবে:

এমনকি xz (বা lzma) অনুলিপিযুক্ত একক ফাইলের ফাইলের আকার (বা, আরও সঠিকভাবে, ডুপ্লিকেটগুলির মধ্যে দূরত্ব) অভিধানের আকারের চেয়ে বেশি হলে ডুপ্লিকেটগুলি খুঁজে পাবেন না। xz (বা lzma) এমনকি সর্বোচ্চ সেটিংয়ের জন্য -9eকেবল এই জন্য M৪ এমবি সংরক্ষণ করা হয়।

ভাগ্যক্রমে আপনি বিকল্পটি দিয়ে নিজের স্বৈরশাসকের আকার নির্দিষ্ট করতে পারবেন --lzma2=dict=256MB (কেবলমাত্র --lzma1=dict=256MBকমান্ডের কাছে লজমা ওরফে ব্যবহার করার সময় অনুমোদিত)

দুর্ভাগ্যক্রমে, উপরের উদাহরণে দেওয়া কাস্টম সংক্ষেপণ চেইনের সাথে সেটিংস ওভাররাইড করার সময়, অন্যান্য সমস্ত প্যারামিটারের জন্য ডিফল্ট মান -9e এর সাথে একই স্তরে সেট করা থাকে না। সুতরাং একক ফাইলের জন্য সংকোচনের ঘনত্ব বেশি নয়।


-2

কোনও কমান্ড লাইন সুইচবিহীন জিজিপ সংক্ষেপণের জন্য সর্বনিম্ন সম্ভাব্য অ্যালগরিদম ব্যবহার করে।

ব্যবহার করার চেষ্টা করুন:

gzip -9 test.tar

আপনার আরও ভাল ফলাফল পাওয়া উচিত


1
আসলেই নয়, পার্থক্যটি ন্যূনতম। আমি অনুরূপ ফলাফলের সাথে bzip2 চেষ্টা করেছিলাম।
Guido

কোনও কমান্ড লাইন সুইচবিহীন জিজিপ সংক্ষেপণের জন্য সর্বনিম্ন সম্ভাব্য অ্যালগরিদম ব্যবহার করে। => এটি সত্য নয় - "ম্যান জিজিপ" বলেছে যে "(টি) সে ডিফল্ট সংকোচনের মাত্রা -6 (যা গতির ব্যয়ে উচ্চ সংকোচনের দিকে পক্ষপাতদুষ্ট)"। আমার জানা সমস্ত জিজিপ সংস্করণে এটি সত্য, যদি সংকলিত ইন-ডিফল্ট সেটিংসগুলি GZIP এনভায়রনমেন্ট ভেরিয়েবলের দ্বারা ওভাররাইড না হয়। এমনকি "-9" স্তরটি এখানে আপনাকে সহায়তা করবে না যেমন ইতিমধ্যে প্রদত্ত উত্তরে ব্যাখ্যা করা হয়েছে।
গুন্টার ওহনার এই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.