2017-04-19 9 views
8

मैं नोकोगिरी वस्तुओं को स्टोर करने के लिए रेल कैश का उपयोग करने के लिए रेल 5 का उपयोग कर रहा हूं।मैं नोकोगिरी वस्तुओं को स्टोर करने के लिए रेल कैश का उपयोग कैसे करूं?

मैं config/initializers/cache.rb में इस बनाया:

$cache = ActiveSupport::Cache::MemoryStore.new 

और मैं जैसे दस्तावेज़ों को संग्रहीत करने के लिए चाहते थे:

$cache.fetch(url) { 
    result = get_content(url, headers, follow_redirects) 
} 

लेकिन मैं इस त्रुटि हो रही है:

Error during processing: (TypeError) no _dump_data is defined for class Nokogiri::HTML::Document 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.2/lib/active_support/cache.rb:671:in `dump' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.2/lib/active_support/cache.rb:671:in `dup_value!' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.2/lib/active_support/cache/memory_store.rb:128:in `write_entry' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.2/lib/active_support/cache.rb:398:in `block in write' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.2/lib/active_support/cache.rb:562:in `block in instrument' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.2/lib/active_support/notifications.rb:166:in `instrument' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.2/lib/active_support/cache.rb:562:in `instrument' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.2/lib/active_support/cache.rb:396:in `write' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.2/lib/active_support/cache.rb:596:in `save_block_result_to_cache' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.2/lib/active_support/cache.rb:300:in `fetch' 
/Users/davea/Documents/workspace/myproject/app/helpers/webpage_helper.rb:116:in `get_cached_content' 
/Users/davea/Documents/workspace/myproject/app/helpers/webpage_helper.rb:73:in `get_url' 
/Users/davea/Documents/workspace/myproject/app/services/abstract_my_object_finder_service.rb:29:in `process_data' 
/Users/davea/Documents/workspace/myproject/app/services/run_crawlers_service.rb:26:in `block (2 levels) in run_all_crawlers' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_thread_pool_executor.rb:348:in `run_task' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_thread_pool_executor.rb:337:in `block (3 levels) in create_worker' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_thread_pool_executor.rb:320:in `loop' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_thread_pool_executor.rb:320:in `block (2 levels) in create_worker' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_thread_pool_executor.rb:319:in `catch' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_thread_pool_executor.rb:319:in `block in create_worker' 

इन वस्तुओं को कैश में स्टोर करने में सक्षम होने के लिए मुझे क्या करने की आवश्यकता है?

+1

जाहिर है, नहीं। हालांकि, तारों को संग्रहित करने के लिए कैश अच्छा है। –

+1

आप ऑब्जेक्ट को स्टोर क्यों करना चाहते हैं? एक क्रमबद्ध हैश या सरणी को स्टोर करें जिसमें आपने नोकोगिरी का उपयोग करके HTML या XML से स्क्रैप की जानकारी दी है। यदि आपको वस्तुओं को स्टोर करने की आवश्यकता है तो ज्ञापन में देखें। –

+1

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

उत्तर

2

उपयोगकर्ता Nokogiri के क्रमानुसार कार्यक्षमता:

$cache = ActiveSupport::Cache::MemoryStore.new 
noko_object = Nokogiri::HTML::Document.new 

serial = noko_object.serialize 
$cache.write(url, serial) 
// Serialized Nokogiri document is now in store at the URL key. 
result = $cache.read(url) 

noko_object = Nokogiri::HTML::Document.new(result) 
// noko_object is now the original document again :) 

Check out the documentation here for more information

+0

धन्यवाद लेकिन "कैश में स्टोर सीरियलाइज्ड ऑब्जेक्ट" के लिए कोड क्या है? मैंने सोचा कि "$ cache.fetch (url) {" का भंडारण भंडारण और फिर चीजों को पुनः प्राप्त करने का ख्याल रखेगा? – Dave

+1

आपको बहुत अच्छी तरह से कुछ भी चाहिए नहीं, मैं सोच रहा था कि आप वहां कुछ अतिरिक्त कर रहे हैं। बस इसे छोड़ दें, जो आप खोज रहे हैं वह 'serialize' है। –

+0

हां लेकिन यह अभी भी असफल रहा है क्योंकि "get_content" एक नोकोगिरी दस्तावेज़ लौटाता है (विधि को बदले में बदला नहीं जा सकता है) और इस तरह से यह बाहरी "$ cache.fetch" को सूचीबद्ध त्रुटि के साथ विफल होने का कारण बन रहा है। मान लीजिए मुझे कुछ नहीं पता (जो मूल रूप से सच है) और कृपया मेरे लिए इसे स्पेल करें। मैं एक ऐसी विधि कैसे लिखूं जो एक नोकोगिरी दस्तावेज़ लौटाता है जो मेरे रेल कैश का उपयोग करता है? – Dave

3

एक्सएमएल को स्ट्रिंग के रूप में स्टोर करें, वस्तु नहीं और उन्हें कैश से बाहर निकालने के बाद उन्हें पार्स करें।

संपादित करें: टिप्पणी के जवाब

कैश इस बजाय

nokogiri_object.to_xml 

EDIT2: प्रतिक्रिया टिप्पणी करने के लिए। इस लाइन के साथ कुछ। यदि आप अधिक विशिष्ट सहायता चाहते हैं तो आपको अधिक कोड पोस्ट करने की आवश्यकता होगी।

nokogiri_object = Nokogiri::XML(cache.fetch('xml_doc')) 

Edit3: प्रतिक्रिया 'के लिए धन्यवाद, लेकिन क्या "कैश में स्टोर धारावाहिक वस्तु" के लिए कोड है? मैंने सोचा कि "$ cache.fetch (url) {" का भंडारण और फिर चीजों को पुनः प्राप्त करने का ख्याल रखेगा? '

cache.write('url', xml_or_serialized_nokogiri_string) 
+0

चलो कुछ कोड उदाहरण देखें। – Dave

+0

हाय, आप इसे वापस एक नोकोगिरी दस्तावेज़ में कहां परिवर्तित कर रहे हैं? मेरी आवश्यकता है कि मुझे कैश विधि का आह्वान करने की आवश्यकता है जो मुझे नोकोगिरी दस्तावेज़ों को स्टोर और पुनर्प्राप्त करने की अनुमति देता है। यदि वे बीच में कुछ मध्यवर्ती रूप लेते हैं, तो यह ठीक है, लेकिन अंतिम परिणाम नोकोगिरी दस्तावेज़ होना चाहिए। मैं अभी भी यह नहीं देख रहा हूं कि आपने जो कुछ प्रदान किया है उसके साथ इसे कैसे प्राप्त किया जाए। – Dave

+0

हो गया! मेरे प्रश्न में मेरा कोड देखें। Get_cached_data विधि में "$ cache.fetch (url) {" के साथ कोड स्ट्रिंग शामिल है। विधि "get_content (url, headers, follow_redirects)" Nokogiri दस्तावेज़ लौटाता है। तो मैं इसका परिणाम कहां ले सकता हूं, इसे एक्सएमएल में बदल सकता हूं, और उसके बाद इसे स्ट्रिंग में बदल सकता हूं? – Dave

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