Sinatra with a persistent variable

后端 未结 3 1298
甜味超标
甜味超标 2020-12-31 07:28

My sinatra app has to parse a ~60MB XML-file. This file hardly ever changes: on a nightly cron job, It is overwritten with another one.

Are there tricks or ways to

相关标签:
3条回答
  • 2020-12-31 08:09

    You could try:

    configure do
      @@nokogiri_object = parse_xml
    end
    

    Then @@nokogiri_object will be available in your request methods. It's a class variable rather than an instance variable, but should do what you want.

    0 讨论(0)
  • 2020-12-31 08:10

    Two options:

    • Save the parsed file to a new file and always read that one.

    You can save in a file – serialize - a hash with two keys: 'last-modified' and 'data'.

    The 'last-modified' value is a date and you check in every request if that day is today. If it is not today then a new file is downloaded, parsed and stored with today's date.

    The 'data' value is the parsed file.

    That way you parse just once time, sort of a cache.

    • Save the parsed file to a NoSQL database, for example redis.
    0 讨论(0)
  • 2020-12-31 08:30

    The proposed solution gives a warning

    warning: class variable access from toplevel

    You can use a class method to access the class variable and the warning will disappear

    require 'sinatra'
    
    class Cache
      @@count = 0
    
      def self.init()
        @@count = 0
      end
    
      def self.increment()
        @@count = @@count + 1
      end
    
      def self.count()
        return @@count
      end
    end
    
    configure do
      Cache::init()
    end
    
    get '/' do
      if Cache::count() == 0
        Cache::increment()
        "First time"
      else
        Cache::increment()
        "Another time #{Cache::count()}"
      end
    end
    
    0 讨论(0)
提交回复
热议问题