Używam Rails 5, aby użyć pamięci podręcznej Rails do przechowywania obiektów Nokogiri.Jak używać pamięci podręcznej Rails do przechowywania obiektów Nokogiri?
Stworzyłem ten w config/inicjalizatorów/cache.rb:
$cache = ActiveSupport::Cache::MemoryStore.new
i chciałem przechowywać dokumenty takie jak:
$cache.fetch(url) {
result = get_content(url, headers, follow_redirects)
}
ale dostaję ten błąd:
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'
Co muszę zrobić, aby móc przechowywać te obiekty w pamięci podręcznej?
Najwyraźniej nie. Pamięć podręczna jest jednak dobra do przechowywania ciągów. –
Dlaczego chcesz przechowywać obiekt? Przechowuj spersonalizowaną tablicę asocjacyjną lub tablicę zawierającą informacje skradzione z HTML lub XML za pomocą Nokogiri. Jeśli chcesz przechowywać obiekty, zajrzyj do notowania. –
Myśląc o tym więcej, pamięć podręczna jest odpowiednia dla rzeczy, do których trzeba natychmiast uzyskać dostęp, ale jeśli urządzenie zostanie wyłączone, można je szybko odtworzyć. Jeśli korzystasz z Nokogiri, szanse są dobre, gdy zgarniesz stronę, co oznacza, że ładujesz tę stronę, a ładowanie, parsowanie, proces skrobania dodaje opóźnienia, których nie chcesz (stąd pomysł użycia cache) , ale zamiast tego powinieneś zebrać swoje dane (meta) i przechowywać je w bazie danych, gdzie są one stale dostępne. DBM będzie buforował wewnętrznie. Nie jest tak szybki jak pamięć podręczna w pamięci, ale jest lepszy niż odtwarzanie na żądanie lub podczas uruchamiania aplikacji. –