2015-06-14 6 views
17

मैं मुसीबत की मांग हो रही है चारों ओर gzfiles में आर यहाँ एक उदाहरण है:एक GZ कनेक्शन पर तलाश अप्रत्याशित है

set.seed(123) 
m=data.frame(z=runif(10000),x=rnorm(10000)) 
write.csv(m,"m.csv") 
system("gzip m.csv") 
file.info("m.csv.gz")$size 
[1] 195975 

कि m.csv.gz बनाता है, जो R उस पर प्राप्त कर सकते हैं कहते हैं, और seek के लिए मदद लगता है इस बात से सहमत करने के लिए:

gzf=gzfile("m.csv.gz") 
open(gzf,"rb") 
isSeekable(gzf) 
[1] TRUE 

अब छोटे जंप, आगे और पीछे, काम करने के लिए लग रहे हैं, लेकिन अगर मैं एक बड़ी छलांग की कोशिश, मैं कोई त्रुटि मिलती है:

seek(gzf,10) 
[1] 10 
seek(gzf,20) 
[1] 10 
seek(gzf,10) 
[1] 20 
seek(gzf,1000) 
[1] 100 
Warning message: 
In seek.connection(gzf, 1000) : 
    seek on a gzfile connection returned an internal error 
'का उपयोग ":

for(i in seq(100,1000,by=100)){seek(gzf,i)} 
seek(gzf,NA) 
[1] 1000 

आर Windows में seek के प्रयोग पर कुछ कठोर शब्द है:

लेकिन अगर मैं कनेक्शन रीसेट और फिर से शुरू, मैं 1000 तक अगर मैं 100-बाइट चरणों में कर प्राप्त कर सकते हैं विंडोज़ पर तलाश 'निराश है। " लेकिन यह एक लिनक्स बॉक्स पर है (आर 3.1.1, 32 बिट)। gz लाइब्रेरी का उपयोग कर पाइथन में इसी तरह का कोड ठीक काम करता है, पूरी तरह से खोज रहा है।

आर 3.2.0 थोड़ा अधिक जानकारीपूर्ण है:

Warning messages: 
1: In seek.connection(gzf, 1000) : invalid or incomplete compressed data 
2: In seek.connection(gzf, 1000) : 
    seek on a gzfile connection returned an internal error 

विचार? मैंने इसे अब एक बग रिपोर्ट के रूप में सबमिट कर दिया है।

उत्तर

3

यह सिर्फ एक शिक्षित अनुमान है: छोटे कूद केवल डिकोडेड बफर के भीतर संभाले जाते हैं, जब आप बफर आकार से अधिक खोजते हैं तो यह सिर्फ कच्ची तलाश करेगा, फिर यह एक चोटी के बीच में gzip को डीकोड करने का प्रयास करता है डीकोडिंग त्रुटि, यह संभवतः आर पुस्तकालय के भीतर एक बग है। मैं सुझाव देने के बजाय छोड़ने का सुझाव देता हूं, क्योंकि अंतर्निहित लाइब्रेरी कुछ और नहीं कर सकती है और प्रदर्शन में कोई प्रभाव नहीं पड़ेगा।

मैंने अभी rzc1952 और rfc1951 की जांच की है, gzip में आप इसे 'सदस्यों' शीर्षलेख को पढ़कर निकालने से पहले फ़ाइल का पूरा आकार जान सकते हैं और सभी ISIZE फ़ील्ड को जोड़ सकते हैं, हालांकि आप नहीं जानते कि एक डिफ्लेटेड ब्लॉक कितना बड़ा होगा इसे डीकोड किए बिना (प्रत्येक प्रतीक का आकार शब्दकोश में है), आप वास्तव में एक सामान्य gzip स्ट्रीम वास्तव में नहीं खोज सकते हैं।

यदि आप वास्तव में एक gzip खोजना चाहते हैं तो आपको इसे पहले से अनुक्रमित करना होगा।

dictzip एक पुस्तकालय है जो अतिरिक्त हेडर को खोजने की अनुमति देने के लिए जोड़ता है।

0

यदि आप मुझे पसंद करते हैं, तो readLines के साथ एक gzipped फ़ाइल पढ़ने के लिए यहां आया, तो आप के बजाय readLines(gzcon(file("your_file.txt.gz", "rb"))) का उपयोग करने का प्रयास कर सकते हैं।

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