PHP

2015-12-10 6 views
6

में बड़ी फ़ाइलों के लिए टुकड़े टुकड़े bzcompression PHP में bzip2 संग्रहीत डेटा बनाना bzcompress में इसके कार्यान्वयन के लिए बहुत आसान है। मेरे वर्तमान एप्लिकेशन में मैं सभी कारणों से केवल इनपुट फ़ाइल को स्ट्रिंग में नहीं पढ़ सकता और फिर bzcompress या bzwrite पर कॉल कर सकता हूं। PHP दस्तावेज़ीकरण यह स्पष्ट नहीं करता है कि डेटा की अपेक्षाकृत कम मात्रा के साथ bzwrite पर लगातार कॉल के परिणामस्वरूप एक ही परिणाम मिलेगा जब पूरी फ़ाइल को एक एकल झुकाव में संपीड़ित किया जाएगा। मैंPHP

function makeBZFile($infile,$outfile) 
{ 
$fp = fopen($infile,'r'); 
$bz = bzopen($outfile,'w'); 
while (!feof($fp))  
{ 
    $bytes = fread($fp,10240); 
    bzwrite($bz,$bytes); 
} 
bzclose($bz); 
fclose($fp); 
} 

function unmakeBZFile($infile,$outfile) 
{ 
$bz = bzopen($infile,'r'); 
while (!feof($bz)) 
{ 
    $str = bzread($bz,10240); 
    file_put_contents($outfile,$str,FILE_APPEND); 
} 
} 

set_time_limit(1200); 
makeBZFile('/tmp/test.rnd','/tmp/test.bz'); 
unmakeBZFile('/tmp/test.bz','/tmp/btest.rnd'); 

नीचे दिखाया गया

$data = file_get_contents('/path/to/bigfile'); 
$cdata = bzcompress($data); 

मैं एक टुकड़ों bzcompression दिनचर्या का उपयोग कर बाहर की कोशिश की, की तर्ज पर कुछ इस कोड को मैंने किया था परीक्षण करने के लिए इसका मतलब यह दो बातें

  • मैं makeBZFile का इस्तेमाल किया और संकुचित करने के लिए unmakeBZFile और उसके बाद SQLite डेटाबेस को डिकंप्रेस करें - जो मुझे अंततः करने की आवश्यकता है।
  • मैं एक 50Mb यादृच्छिक डेटा dd if=/dev/urandom of='/tmp.test.rnd bs=50M count=1

दोनों ही मामलों मैं एक diff original.file decompressed.file प्रदर्शन किया और पाया कि दो समान थे से भरा बनाया।

सभी बहुत अच्छे हैं लेकिन यह मुझे स्पष्ट नहीं है कि यह क्यों काम कर रहा है। PHP दस्तावेज़ बताते हैं कि bzread(bzpointer,length)UNCOMPRESSED डेटा के अधिकतम length बाइट्स को पढ़ता है। यदि नीचे मेरा कोड खराब है तो यह इसलिए है क्योंकि मैं bzwite और bzread आकार 10240 बाइट्स को मजबूर कर रहा हूं।

क्या मैं नहीं देख सकता bzread कितना जानता है असम्पीडित डेटा की lenth बाइट्स लाने के लिए कैसे है। मैंने format of a bzip2 file की जांच की। मैं नहीं देख सकता कि वहाँ कुछ भी है जो .bz फ़ाइल के एक हिस्से के लिए असम्पीडित डेटा लंबाई को आसानी से स्थापित करने में मदद करता है।

मुझे संदेह है कि यह कैसे काम करता है इसकी मेरी समझ में एक अंतर है - या फिर तथ्य यह है कि नीचे मेरा कोड सही टुकड़े टुकड़े संपीड़न करने के लिए प्रतीत होता है पूरी तरह आकस्मिक है।

मैं यहां कुछ स्पष्टीकरणों की सराहना करता हूं।

उत्तर

3

यह समझने के लिए कि डिकंप्रेशन को बाइट्स की लंबाई कैसे प्राप्त होती है, आपको पहले संपीड़न को समझना होगा। ऐसा लगता है कि आप संपीड़न एल्गोरिगिम के बारे में कुछ भी नहीं जानते हैं।

BZIP2

BZIP2 की महत्वपूर्ण एल्गोरिथ्म Burrows Wheeler transformation (BWT), कि कोडिंग निम्नलिखित के लिए एक उपयुक्त रूप में मूल डेटा परिवर्तित करता है। वर्तमान संस्करण Huffman code लागू होता है। संपीड़न एल्गोरिदम प्रत्येक ब्लॉक से पूरी तरह से स्वतंत्र ब्लॉक में डेटा को संसाधित करता है। ब्लॉक आकार को 1-9 (100,000 - 900,000 बाइट्स) से एक श्रेणी में सेट किया जा सकता है।

BZIP2 डेटा संरचना

संकुचित स्ट्रिंग के पहले दो चरित्र पत्र 'BZ' और इस्तेमाल किया algorigthim के लिए उसके बाद 1 बाइट के साथ शुरू करते हैं। इसके बाद ब्लॉक आकार की पहचान पूरी तरह से होती है, पूरे फ़ाइल (h1, h2, h3 से h9) के लिए वैध होने के बाद।पैरामीटर इकाइयों में ब्लॉक आकार को 1-9 (100,000 - 900,000 बाइट्स) से इंगित करता है।

वास्तविक मूल डेटा चयनित आकार के अनुसार ब्लॉक में संग्रहीत किया जाता है और एक सीआरसी 32 चेकसम के साथ व्यक्तिगत रूप से संरक्षित किया जाएगा। इसके अतिरिक्त एक 48 बिट पहचानकर्ता प्रत्येक ब्लॉक पेश करता है। यह ब्लॉक संरचना क्षतिग्रस्त फाइलों के आंशिक पुनर्निर्माण की अनुमति देता है।

GZIP/BZIP

Gzip और bzip2 कार्यात्मक रूप से बराबर कर रहे हैं। जीजेआईपी का एक फायदा यह है कि यह एक धारा को संकुचित कर सकता है, एक अनुक्रम जहां आप पीछे नहीं देख सकते हैं। यह इसे http धाराओं का आधिकारिक कंप्रेसर बनाता है। GZZIP DEFLATE आरएफसी 1 9 51 संपीड़ित डेटा प्रारूप विशिष्टता और गुंजिप आरएफसी 1 9 52 फ़ाइल प्रारूप विशिष्टता दस्तावेज प्रकाशित हैं।

GIP समझाया

GZIP Explained

+0

जवाब के लिए धन्यवाद। आपने देखा होगा कि मेरे प्रश्न में मैं बीजेआईपी फ़ाइल प्रारूप का एक लिंक प्रदान करता हूं जिसे मैंने प्रश्न प्रस्तुत करने से पहले अध्ययन किया था। आपका उत्तर यह समझने में सहायता करता है कि 'bzwrite' डेटा टुकड़े टुकड़े कैसे लिखता है। यह मुझे स्पष्ट नहीं है कि 'bzread' निर्दिष्ट संख्या * असंपीड़ित * बाइट्स को पढ़ने के लिए कैसे प्रबंधित करता है। यह देखते हुए कि प्रत्येक ब्लॉक में डेटा के आधार पर संपीड़न की डिग्री अलग-अलग होगी, यह सोचने के रूप में सरल नहीं है "* वह असम्पीडित डेटा के एक्स बाइट चाहता है तो मुझे अगले एक्स/असम्पीडित_इज ब्लॉक को लाएं" – DroidOS

+0

यह सीधे जैकेट नहीं है असंपीड़न बाइट्स में बाइट पढ़ने के लिए सूत्र। सबसे पहले हफमैन पेड़ को समझा जाता है और पेड़ के अनुसार संपीड़न डेटा असंपीड़ित होता है। – Vineet1982

+0

आपको और कुछ और जानना है बस मुझे बताएं या जवाब स्वीकार करें – Vineet1982

संबंधित मुद्दे