我有一个类在实例化时将三个不同文件的内容读入类变量,如下所示:
class Catalog
class << self
def change_file_name
standard = Standard.where(klass_name: self.to_s).first
month = Date::ABBR_MONTHNAMES[standard.version_date.month]
year = standard.version_date.year
"#{Rails.root.to_s}/#{month}_#{year}_changed_products.csv"
end
def get_changes
changes = {}
begin
IO.foreach(change_file_name) do |line|
row = CSV.parse_line(line.encode!('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '').strip, { quote_char: '"' })
version = row.pop
changes[version] ||= {}
changes[version][row[1]] = row[3]
end
rescue => bang
raise "Error opening #{change_file_name}: #{bang.message}"
end
changes
end
end
class << self; attr_accessor :changes end
@changes ||= self.get_changes
end
现在,我已经在实例化此类时读取的文件大小达到临界质量。我认为我没有正确设置类变量。
当调用这个类时(甚至没有实例化,只需要constantized
它需要花费8秒钟。在它被实例化之后,它会好一段时间。但是我猜它会被内存清除掉,而它必须再次加载。这需要另外8秒到一分钟。
理想情况下,它会在我的应用程序启动时加载一次,那就是那样。有没有办法做到这一点?我感谢你的帮助,因为这是我的一个特别的弱点。我需要这些数据随时可用。但如果这不起作用,将此代码放入初始化程序并将文件加载到常量中会更好吗?谢谢你的帮助。
答案 0 :(得分:1)
您可以使用类变量(用@@标记)在类级别存储数据。
此外,您可以将单例模式应用于目录(https://en.wikipedia.org/wiki/Singleton_pattern)。
正如你所说,你有很多数据,第二种选择是更好的选择。