बड़ी GZIPPED फ़ाइल के असम्पीडित आकार का काम करने का सबसे तेज़ तरीका


24

एक बार जब कोई फ़ाइल gzipped होती है, तो क्या यह कहने के लिए जल्दी से क्वेरी करने का एक तरीका है कि असम्पीडित फ़ाइल का आकार क्या है (इसे डिकम्प्रेस किए बिना), खासकर उन मामलों में जहां असम्पीडित फ़ाइल आकार में 4GB है।

RFC https://tools.ietf.org/html/rfc1952#page-5 के अनुसार, आप फ़ाइल के अंतिम 4 बाइट्स को क्वेरी कर सकते हैं, लेकिन अगर असम्पीडित फ़ाइल> 4GB थी, तो मान सिर्फ प्रतिनिधित्व करता हैuncompressed value modulo 2^32

इस मान को चलाकर भी पुनर्प्राप्त किया जा सकता है gunzip -l foo.gz, हालांकि "असम्पीडित" कॉलम में uncompressed value modulo 2^32फिर से शामिल है , संभवत: जैसा कि ऊपर वर्णित पाद लेख पढ़ रहा है।

मैं बस सोच रहा था कि वहाँ असंपीड़ित फ़ाइल का आकार प्राप्त करने का एक तरीका है, इसे पहले डिकम्प्रेस किए बिना, यह विशेष रूप से उस मामले में उपयोगी होगा जहाँ gzipped फ़ाइलों में 50GB + डेटा होता है और इस तरह के तरीकों का उपयोग करते हुए डिकम्प्रेस करने में कुछ समय लगेगा gzcat foo.gz | wc -c


संपादित करें: 4GB सीमा खुलेआम में स्वीकार किया है manकी पेज gzipउपयोगिता के साथ OSX शामिल ( Apple 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 में बाहर आया। मुझे आश्चर्य होगा कि कई 23 साल के बच्चे यहां घूम रहे थे। मुझे यकीन है कि कुछ हैं लेकिन मैं जो बता सकता हूं कि औसत आयु 30-35 के आसपास है।
ब्राचली

2
ऐसा करने के लिए एक अच्छा समय हो सकता है xzजिसके पास वह सीमा न हो। GNU पर स्विच कर रहा है xz
स्टीफन चेजलस

@ स्टीफनचैचेलस दिलचस्प। दुर्भाग्य से जिन फाइलों में मेरी दिलचस्पी है, वे मेरे नियंत्रण से बाहर हैं (यानी हम उन्हें संपीड़ित करते हैं), लेकिन यह निश्चित रूप से ऐसा लगता है xz कि इस मुद्दे को हल करेगा।
djhworld 19

जवाबों:


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उस संबंध में पहले से ही अनुकूलित है? यह सुधार करने के लिए काफी छोटा है जैसे कि आपने केवल आउटपुट समय बचाया है।
फ्रॉस्ट्सचुट्ज़

हां, इसे मूल आकार का पता लगाने के लिए सब कुछ कम करने की आवश्यकता है ... इसलिए यह केवल आउटपुट समय की बचत कर रहा है, लेकिन मुझे लगता है कि यह सब बचाया जा सकता है।
स्टीफन किट

दिलचस्प है, हाँ, मैं सोच रहा था कि आपको वास्तव में काम करने के लिए कोड बदलने की आवश्यकता होगी। दुर्भाग्य से मेरे उदाहरण में जिन फाइलों में मेरी दिलचस्पी है वे वास्तव में मेरे नियंत्रण में नहीं हैं, मैं उन्हें एक बाहरी पार्टी से प्राप्त करता हूं इसलिए उन्हें पहली जगह में संपीड़ित करने में सक्षम नहीं होगा। मुझे लगता है कि पूरी तरह से समर्थन करने का एकमात्र तरीका> 4GB फाइलें गज़िप पैच करना होगा, जिसमें 12 बाइट फुटर, सीआरसी के लिए 4 बाइट्स और फाइल के लिए 8 बाइट्स (64 बिट) होंगे। हालाँकि यह मौजूदा gzips के साथ पीछे की संगतता को तोड़ देगा!
djhworld

जो समाधान मैं ऊपर दे रहा हूं उसमें शुरू में फाइलों को संपीड़ित करना शामिल नहीं है, भले ही मैं चल रहा हूं gzip; मैं बस gzipसंपीड़ित फ़ाइलों पर चलता हूं , जो उन्हें पुन: संपीड़ित नहीं करता है, यह उन्हें सत्यापित करता है। (पैच एक त्वरित और गंदा सबूत की अवधारणा है, इसके साथ काम करने के लिए कुछ और बदलावों की आवश्यकता है gunzip।)
स्टीफन किट

@StephenKitt आह दिलचस्प! एक बेहतर / डस्टीयर हैक उस डेटा को FCOMMENTक्षेत्र में एम्बेड करने के लिए होगा । इस तरह से उपयोगकर्ता उस डेटा को पुनः प्राप्त करने के लिए एक बाइट श्रेणी को क्वेरी कर सकते हैं। यह मेरे मामले में उपयोगी होगा, विशेष रूप से अमेज़ॅन S3 में संग्रहीत वस्तुओं के लिए
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
क्या सभी फ़ाइलों की सूची प्राप्त करने के लिए tar.gz को पूरी तरह से विघटित नहीं करना पड़ता है?
फ्रॉस्ट्सचुट्ज़

वास्तव में यह होना ही है। यह एकमात्र तरीका है जिससे मैं असम्पीडित फ़ाइल आकार प्राप्त करने के बारे में सोच सकता हूं। साथ 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
यह वही है जो ओपी करने की कोशिश कर रहा है।
पदावनत करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.