Синатра с постоянной переменной - программирование
Подтвердить что ты не робот

Синатра с постоянной переменной

Мое приложение sinatra должно разбирать XML файл размером ~ 60 МБ. Этот файл почти никогда не меняется: на ночной работе cron он перезаписывается другим.

Есть ли уловки или способы сохранить анализируемый файл в памяти как переменную, чтобы я мог читать из нее по входящим запросам, но не нужно разбирать ее снова и снова для каждого входящего запроса?

Некоторые псевдокоды, чтобы проиллюстрировать мою проблему.

get '/projects/:id'
  return @nokigiri_object.search("//projects/project[@id=#{params[:id]}]/name/text()")
end

post '/projects/update'
  if params[:token] == "s3cr3t"
    @nokogiri_object = reparse_the_xml_file
  end
end

Мне нужно знать, как создать такой @nokogiri_object, чтобы он сохранялся при запуске Sinatra. Возможно ли это вообще? Или мне нужно некоторое хранилище для этого?

4b9b3361

Ответ 1

Вы можете попробовать:

configure do
  @@nokogiri_object = parse_xml
end

Затем @@nokogiri_object будет доступен в ваших методах запроса. Это переменная класса, а не переменная экземпляра, но должна делать то, что вы хотите.

Ответ 2

Предлагаемое решение дает предупреждение

предупреждение: доступ к переменной класса из toplevel

Вы можете использовать метод класса для доступа к переменной класса, и предупреждение исчезнет

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

Ответ 3

Два варианта:

  • Сохраните проанализированный файл в новом файле и всегда прочитайте его.

Вы можете сохранить в файле - сериализовать - хеш с двумя ключами: "последний-измененный" и "данные".

Значение "last-modified" - это дата, и вы проверяете каждый запрос, если этот день сегодня. Если это не сегодня, то новый файл загружается, анализируется и сохраняется с сегодняшней датой.

Значение "data" - это проанализированный файл.

Таким образом, вы анализируете только один раз, тип кеша.

  • Сохраните проанализированный файл в базе данных NoSQL, например redis.