বড় GZIPPED ফাইলের সঙ্কুচিত আকারের কাজ করার দ্রুততম উপায়


24

একবার কোনও ফাইল গিজিপ করা হয়ে গেলে, কী চাপবিহীন ফাইলের আকারটি (এটি সঙ্কুচিত না করে) কী তা বলার জন্য কী তাড়াতাড়ি জিজ্ঞাসা করার কোনও উপায় রয়েছে, বিশেষত এমন ক্ষেত্রে যেখানে সঙ্কুচিত ফাইলটি> 4 জিবি আকারের হয়।

আরএফসি https://tools.ietf.org/html/rfc1952# পৃষ্ঠা -5 অনুসারে আপনি ফাইলের শেষ 4 বাইট জিজ্ঞাসা করতে পারেন, তবে যদি সঙ্কোচিত ফাইলটি> 4 জিবি ছিল তবে মানটি কেবল প্রতিনিধিত্ব করেuncompressed value modulo 2^32

এই মানটি চালিয়েও পুনরুদ্ধার করা যেতে পারে gunzip -l foo.gz, তবে "সঙ্কুচিত" কলামটিতে uncompressed value modulo 2^32আবার অন্তর্ভুক্ত রয়েছে সম্ভবত এটি উপরে বর্ণিত ফুটারটি পড়ার কারণে as

আমি কেবল ভাবছিলাম যে যদি প্রথমে সঙ্কুচিত না হয়ে সঙ্কুচিত ফাইলের আকার পাওয়ার কোনও উপায় আছে তবে এটি বিশেষত কার্যকর হবে যেখানে জিজেপড ফাইলগুলিতে 50 গিগাবাইট + ডেটা রয়েছে এবং এই জাতীয় পদ্ধতিগুলি ব্যবহার করে ডিসক্রप्रेस করতে কিছুটা সময় লাগবে gzcat foo.gz | wc -c


সম্পাদনা: ওএসএক্স ( ) এর সাথে অন্তর্ভুক্ত ইউটিলিটির manপৃষ্ঠায় 4 জিবি সীমাবদ্ধতা প্রকাশ্যে স্বীকার করা হয়েছেgzipApple gzip 242

  BUGS
    According to RFC 1952, the recorded file size is stored in a 32-bit
    integer, therefore, it can not represent files larger than 4GB. This
    limitation also applies to -l option of gzip utility.

2
+1 ভাল প্রশ্ন! আমি উত্তরটি হ্যাঁ সন্দেহ করি যে, এই জাতীয় ফাইলের আকার প্রত্যাশিত হওয়ার আগে শিরোনাম বিন্যাসটি এমন এক সময় ডিজাইন করা হয়েছিল। এটি সম্পর্কে চিন্তাভাবনা করে, gzipঅবশ্যই এই সম্প্রদায়ের অনেক ব্যবহারকারীর চেয়ে বয়স্ক হওয়া উচিত!
সেলেদা

2
gzip1992 সালে বেরিয়ে এসেছিল here আমি এখানে প্রায় 23 বছর বয়সী ঘুরে বেড়াতে থাকলে অবাক হব। আমি নিশ্চিত যে এর কিছু রয়েছে তবে আমি মধ্যযুগের বয়স 30-35 এর কাছাকাছি বলতে পারি from
ব্র্যাচলে

2
xzযার সীমাবদ্ধতা নেই তাতে স্যুইচ করার জন্য ভাল সময় হতে পারে । জিএনইউ স্যুইচ করছে xz
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলা আকর্ষণীয়। দুর্ভাগ্যক্রমে আমি যে ফাইলগুলিতে আগ্রহী সেগুলি আমার নিয়ন্ত্রণের বাইরে (যেমন আমরা সেগুলি xz সংক্ষেপিতভাবে গ্রহণ করি) তবে এটিকে অবশ্যই সমাধান করা উচিত বলে মনে হচ্ছে ।
djhworld

উত্তর:


11

আমি বিশ্বাস করি যে দ্রুততম gzipউপায়টি সংশোধন করা যাতে ভার্জোজ মোডে পরীক্ষা করা সংক্রমিত হওয়া বাইটের সংখ্যাকে আউটপুট করে; আমার সিস্টেমে একটি 7761108684-বাইট ফাইল সহ, আমি পেয়েছি

% time gzip -tv test.gz
test.gz:     OK (7761108684 bytes)
gzip -tv test.gz  44.19s user 0.79s system 100% cpu 44.919 total

% time zcat test.gz| wc -c
7761108684
zcat test.gz  45.51s user 1.54s system 100% cpu 46.987 total
wc -c  0.09s user 1.46s system 3% cpu 46.987 total

জিজিপ পরিবর্তন করতে (দেবিয়ান-তে উপলব্ধ 1.6), প্যাচটি নিম্নরূপ:

--- a/gzip.c
+++ b/gzip.c
@@ -61,6 +61,7 @@
 #include <stdbool.h>
 #include <sys/stat.h>
 #include <errno.h>
+#include <inttypes.h>

 #include "closein.h"
 #include "tailor.h"
@@ -694,7 +695,7 @@

     if (verbose) {
         if (test) {
-            fprintf(stderr, " OK\n");
+            fprintf(stderr, " OK (%jd bytes)\n", (intmax_t) bytes_out);

         } else if (!decompress) {
             display_ratio(bytes_in-(bytes_out-header_bytes), bytes_in, stderr);
@@ -901,7 +902,7 @@
     /* Display statistics */
     if(verbose) {
         if (test) {
-            fprintf(stderr, " OK");
+            fprintf(stderr, " OK (%jd bytes)", (intmax_t) bytes_out);
         } else if (decompress) {
             display_ratio(bytes_out-(bytes_in-header_bytes), bytes_out,stderr);
         } else {

এটি কি এখনও অভ্যন্তরীণভাবে প্রকৃত ডেটা তৈরি করে, বা -tইতিমধ্যে সেই বিষয়ে অনুকূলিত হয়েছে? আপনি কেবলমাত্র আউটপুট সময় সাশ্রয় করেছেন এমনটি দেখানোর জন্য উন্নতিটি যথেষ্ট ছোট is
frostschutz

হ্যাঁ, আসল আকারটি বের করার জন্য এটি সবকিছুকে সংক্ষেপণ করা দরকার ... সুতরাং এটি কেবলমাত্র আউটপুট সময় সাশ্রয় করছে, তবে আমি মনে করি এটিই কেবল সংরক্ষণ করা যায়।
স্টিফেন কিট

আকর্ষণীয়, হ্যাঁ আমি ভাবছিলাম আসলে এটির কাজ করার জন্য আপনার কোড পরিবর্তন করতে হবে। দুর্ভাগ্যক্রমে আমার উদাহরণে আমি যে ফাইলগুলি আগ্রহী সেগুলি আসলে আমার নিয়ন্ত্রণে নেই, আমি এগুলি কোনও বাহ্যিক পক্ষের কাছ থেকে পেয়েছি তাই এগুলি প্রথম স্থানে সংকোচন করতে সক্ষম হবে না। আমি মনে করি> 4 জিবি ফাইলকে সম্পূর্ণ সমর্থন করার একমাত্র উপায় হ'ল জিজেপকে 12 বাইট ফুটার, সিআরসি জন্য 4 বাইট এবং ফাইলাইজের জন্য 8 বাইট (64 বিট) প্যাচ করা হবে। তবে এটি বিদ্যমান জিজিপগুলির সাথে পিছনে সামঞ্জস্যতা ভেঙে দেবে!
djhworld

আমি উপরে যে সমাধানটি দিয়েছি তা প্রাথমিকভাবে ফাইলগুলি সংকোচনের সাথে জড়িত নয়, যদিও আমি চলছে gzip; আমি কেবল gzipসংক্ষেপিত ফাইলগুলিতে চালনা করি যা এগুলি পুনরায় সংকুচিত করে না, এটি কেবল তাদের যাচাই করে। (প্যাচটি ধারণার একটি দ্রুত এবং নোংরা প্রমাণ, এটি নিয়ে কাজ করার জন্য আরও কয়েকটি পরিবর্তন দরকার changes gunzip)
স্টিফেন কিট

@ স্টেফেনকিট আহ আকর্ষণীয়! FCOMMENTক্ষেত্রের সেই ডেটা এম্বেড করার জন্য আরও ভাল / ডাইর্টিয়ার হ্যাক হবে । এই উপায়ে ব্যবহারকারীরা সেই ডেটা পুনরুদ্ধার করতে একটি বাইট সীমাটি জিজ্ঞাসা করতে পারে। এটি আমার ক্ষেত্রে কার্যকর হবে, বিশেষত অ্যামাজন এস 3-এ সঞ্চিত আইটেমগুলির জন্য
djhworld

0

আপনি যদি একটি কম্প্রেস ফাইল বা ফাইল সেট আকার প্রয়োজন হয়, তাহলে আপনার সেরা বাজি ব্যবহার করা tar -zবা tar -jপরিবর্তে gzipযেমন tarডিকম্প্রেস করা ফাইল আকার অন্তর্ভুক্ত করা হয়েছে। lesspipeফাইলগুলির তালিকায় উঁকি দেওয়ার জন্য ব্যবহার করুন :

aptitude install lesspipe
lesspipe <compressed file> | less

যদি lessব্যবহারের জন্য কনফিগার করা থাকে lesspipe:

less <compressed file>

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

আর একটি পদ্ধতি হ'ল সংকুচিত অনুপাতটি লগ করা এবং তার পরিবর্তে যে ফাইলটিকে [পাঠ্য] ফাইলটি জিজ্ঞাসা করা হবে:

gzip --verbose file 2>&1 | tee file.gz.log
file:    64.5% -- replaced with file.gz

যদিও আসল ফাইলের আকারটি খুঁজে পেতে এটি গণনা প্রয়োজন।

আপনি tarএটির সাথেও এটি করতে পারেন , এটি আসলে আমি বড় আকারের ব্যাকআপগুলি দিয়ে যা করি এটি উদাহরণস্বরূপ, কেবলমাত্র একটি ফাইলের আকার বা নাম পেতে পুরো ডিকম্প্রেশন প্রক্রিয়াটি চালানো বাধা দেয়।


2
সমস্ত ফাইলের তালিকা পাওয়ার জন্য কি টার্ম.gz পুরোপুরি ডিকম্প্রেস করতে হবে না?
frostschutz

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

1
এই মুহুর্তে ওপি wc -cকমান্ডটিও করতে পারে ।
ব্র্যাচলে

অবশ্যই ব্র্যাচলে তবে সমস্ত ফলাফল পেতে এটি যথেষ্ট পরিমাণ সময় নিতে চাই। ফাইলের আকারগুলিতে লগ করার জন্য আমার দুটি পরামর্শ।

0

কি সম্পর্কে

gzip -l file.gz|tail -n1|awk '{print $2}'

numfmt --to=iec $(gzip -l file.gz|tail -n1|awk '{print $2}')

1
এটি বড় ফাইলগুলির জন্য কাজ করে না, যেমন ওপি দ্বারা ব্যাখ্যা করা হয়েছে।
স্টিফেন কিট

-2
gunzip -c $file | wc -c

এটি একটি দীর্ঘ সময় নিতে হবে, কিন্তু আপনাকে বাইটে চূড়ান্ত আকার দেবে।


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