Синатра с постоянной переменной - PullRequest
13 голосов
/ 22 июня 2011

Моему приложению 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, чтобы он сохранялся при запуске Синатры. Это возможно вообще? Или мне для этого нужно какое-то хранилище?

Ответы [ 3 ]

9 голосов
/ 22 июня 2011

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

configure do
  @@nokogiri_object = parse_xml
end

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

8 голосов
/ 30 января 2014

Предложенное решение выдает предупреждение

предупреждение: доступ к переменной класса с верхнего уровня

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

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 голосов
/ 22 июня 2011

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

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

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

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

Значением 'data' является проанализированный файл.

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

  • Сохраните проанализированный файл в базе данных NoSQL, например, redis.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...