2014-06-13 11 views
5

का उपयोग करते समय BufError a 8.9MB file डाउनलोड करने के लिए मैं निम्नलिखित रूबी स्निपेट का उपयोग करता हूं।ज़्लिब :: प्रगति पट्टी/रूबी-प्रोग्रेसबार मणि

require 'open-uri' 
require 'net/http' 
require 'uri' 

def http_download_no_progress_bar(uri, filename) 
    uri.open(read_timeout: 500) do |file| 
    open filename, 'w' do |io| 
     file.each_line do |line| 
     io.write line 
     end 
    end 
    end 
end 

मैं डाउनलोड की प्रक्रिया कल्पना करने के लिए progressbar मणि जोड़ना चाहते हैं:

/home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http/response.rb:357:in `finish': 
buffer error (Zlib::BufError)oooooo | 8.0MB 8.6MB/s ETA: 0:00:00 

    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http/response.rb:357:in `finish' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http/response.rb:262:in `ensure in inflater' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http/response.rb:262:in `inflater' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http/response.rb:274:in `read_body_0' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http/response.rb:201:in `read_body' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:328:in `block (2 levels) in open_http' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http.rb:1415:in `block (2 levels) in transport_request' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http/response.rb:162:in `reading_body' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http.rb:1414:in `block in transport_request' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http.rb:1405:in `catch' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http.rb:1405:in `transport_request' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http.rb:1378:in `request' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:319:in `block in open_http' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http.rb:853:in `start' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:313:in `open_http' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:724:in `buffer_open' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:210:in `block in open_loop' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:208:in `catch' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:208:in `open_loop' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:149:in `open_uri' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:704:in `open' 

इस बीच मैं भी ruby-progressbar की कोशिश की:

require 'open-uri' 
require 'progressbar' 
require 'net/http' 
require 'uri' 

def http_download_with_progressbar(uri, filename) 
    progressbar = nil 
    uri.open(
    read_timeout: 500, 
    content_length_proc: lambda { |total| 
    if total && 0 < total.to_i 
     progressbar = ProgressBar.new("...", total) 
     progressbar.file_transfer_mode 
    end 
    }, 
    progress_proc: lambda { |step| 
     progressbar.set step if progressbar 
    } 
) do |file| 
    open filename, 'w' do |io| 
     file.each_line do |line| 
     io.write line 
     end 
    end 
    end 
end 

हालांकि, अब यह निम्नलिखित त्रुटि के साथ विफल मणि:

require 'open-uri' 
require 'ruby-progressbar' 
require 'net/http' 
require 'uri' 

def http_download_with_ruby_progressbar(uri, filename) 
    progressbar = nil 
    uri.open(
    read_timeout: 500, 
    content_length_proc: lambda { |total| 
     if total && 0 < total.to_i 
     progressbar = ProgressBar.create(title: filename, total: total) 
     end 
     }, 
     progress_proc: lambda { |step| 
     progressbar.progress = step if progressbar 
     } 
) do |file| 
    open filename, 'w' do |io| 
     file.each_line do |line| 
     io.write line 
     end 
    end 
    end 
end 

यह समान त्रुटि के साथ विफल रहता है। समस्या के लिए associated issue यहां है।

+0

टीआईएल ['ओपन-यूरी'] (http://ruby-doc.org/stdlib/libdoc/open-uri/rdoc/OpenURI/OpenRead.html#method-i-open) में कुछ साफ विकल्प हैं (और क्षमा करें मैं आपकी समस्या से मदद नहीं कर सकता) ... – DMKE

उत्तर

4

समस्या वह फ़ाइल है जिसे आप डाउनलोड करने का प्रयास कर रहे हैं क्योंकि प्रत्येक विधि this file: https://androidnetworktester.googlecode.com/files/1mb.txt के साथ काम करती है।

समस्या यह है कि आपकी फ़ाइल यह कहने से बड़ी है। Content_length_proc का कहना है कि यह 8549968 बाइट्स (8.15MB) है जबकि यह 101187668 बाइट्स (96.5MB) है (फ़ाइल डाउनलोड करने के बाद ls के साथ जांचें)। अब मैं एक विकल्प है कि दुर्घटना नहीं करता है और आप एक प्रगति बार देता है:

def http_download_with_words(uri, filename) 
    bytes_total = nil 
    uri.open(
      read_timeout: 500, 
      :content_length_proc => lambda{|content_length| 
      bytes_total = content_length}, 
      :progress_proc => lambda{|bytes_transferred| 
      if bytes_total 
       # Print progress 
       print("\r#{bytes_transferred}/#{bytes_total}") 
      else 
       # We don’t know how much we get, so just print number 
       # of transferred bytes 
       print("\r#{bytes_transferred} (total size unknown)") 
      end 
      } 
      ) do |file| 
    open filename, 'w' do |io| 
     file.each_line do |line| 
     io.write line 
     end 
    end 
    end 
end 

http_download_with_words(URI('http://data.wien.gv.at/daten/geo?service=WFS&request=GetFeature&version=1.1.0&typeName=ogdwien%3aBAUMOGD&srsName=EPSG:4326'), 'temp.txt') 

जो सुंदर आत्म व्याख्यात्मक है, (here देखा।)

अब हिस्सा मैं यह पता लगाने की नहीं कर पाए हैं यह है कि वास्तव में प्रगतिबार मणि ZLib के साथ हस्तक्षेप कर रहा है। ज्यादातर चीजें प्रोसेस के अंदर ठीक काम करती प्रतीत होती हैं (उदाहरण के लिए उन्हें यादृच्छिक सामान प्रिंट करना) इसलिए मुझे लगता है कि इन दोनों प्रगतिकर्ताओं को पूरा होने पर कुछ अजीब बात है जो किसी भी तरह से स्थानांतरण के साथ गड़बड़ कर देता है। मुझे कोई दिलचस्पी होगी अगर कोई यह समझ सके कि वह क्यों है?

+0

अच्छा शोध। मैंने फ़ाइल आकार में अंतर नहीं देखा। बहुत बुरा यह रत्नों में से एक के साथ काम नहीं करता है। अफसोस की बात है कि रखरखाव मेरे अनुरोधों को अनदेखा कर रहा है। मैं अगले दिनों के भीतर अपने समाधान को एकीकृत करने की कोशिश करूंगा। – JJD

+0

मैंने अभी कोशिश की (छुट्टी के बाद)। यह अच्छा काम करता है। इस मामले में मैं दृश्य प्रगति पट्टी को छोड़ सकता हूं। धन्यवाद। – JJD

2

मेरे परीक्षण में यह हुआ जब यह #set में वृद्धि के कारण था। इसके लिए ज़्लिब में एक त्रुटि क्यों होती है, यह स्पष्ट नहीं है। शायद वहां कुछ अजीब अपवाद हैंडलिंग। मेरे मामले में मैंने इस मुद्दे से छुटकारा पाने के लिए "progbar.set (count) बचाव शून्य" किया था।

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