由于设计不佳,类实例化永远存在

时间:2015-07-07 03:43:58

标签: ruby-on-rails ruby class caching

我有一个类在实例化时将三个不同文件的内容读入类变量,如下所示:

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秒到一分钟。

理想情况下,它会在我的应用程序启动时加载一次,那就是那样。有没有办法做到这一点?我感谢你的帮助,因为这是我的一个特别的弱点。我需要这些数据随时可用。但如果这不起作用,将此代码放入初始化程序并将文件加载到常量中会更好吗?谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用类变量(用@@标记)在类级别存储数据。

此外,您可以将单例模式应用于目录(https://en.wikipedia.org/wiki/Singleton_pattern)。

正如你所说,你有很多数据,第二种选择是更好的选择。