Ответ 1
Вы можете попробовать:
configure do
@@nokogiri_object = parse_xml
end
Затем @@nokogiri_object
будет доступен в ваших методах запроса. Это переменная класса, а не переменная экземпляра, но должна делать то, что вы хотите.
Мое приложение 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. Возможно ли это вообще? Или мне нужно некоторое хранилище для этого?
Вы можете попробовать:
configure do
@@nokogiri_object = parse_xml
end
Затем @@nokogiri_object
будет доступен в ваших методах запроса. Это переменная класса, а не переменная экземпляра, но должна делать то, что вы хотите.
Предлагаемое решение дает предупреждение
предупреждение: доступ к переменной класса из 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
Два варианта:
Вы можете сохранить в файле - сериализовать - хеш с двумя ключами: "последний-измененный" и "данные".
Значение "last-modified" - это дата, и вы проверяете каждый запрос, если этот день сегодня. Если это не сегодня, то новый файл загружается, анализируется и сохраняется с сегодняшней датой.
Значение "data" - это проанализированный файл.
Таким образом, вы анализируете только один раз, тип кеша.