1

我的 Rails 应用程序中有一个 mongoid 模型/类。它看起来像这样:

class Operation
  include Mongoid::Document
  include Mongoid::Timestamps
  extend Mongoid::MarshallableField

  marshallable_field :message

  def load_message
    message
  end
end

message包含数千个元素的数组,因此已使用Marshal将其转换为字节流。

我需要能够message快速加载,但目前大约需要。1.4 秒加载,例如使用load_message上面显示的方法。

我怎样才能加快速度?

供您参考,这是我的配置:

## app/lib/mongoid/marshallable_field.rb

module Mongoid
  module MarshallableField

    def marshallable_field(field_name, params = {})

      set_method_name = "#{field_name}=".to_sym
      get_method_name = "#{field_name}".to_sym
      attr_name = "__#{field_name}_marshallable_path".to_sym

      send :define_method, set_method_name do |obj|
        if Rails.env == "development" || Rails.env == "test"
          path = File.expand_path(Rails.public_path + "/../file_storage/#{Time.now.to_i}-#{id}.class_dump")
        elsif Rails.env == "production"
          path = "/home/ri/prod/current/file_storage/#{Time.now.to_i}-#{id}.class_dump"
        end

        f = File.new(path, "w")
        Marshal.dump(obj, f)
        f.close
        update_attribute(attr_name, path)
        path
      end

      send :define_method, get_method_name do 
        if self[attr_name] != nil
          file = File.open(self[attr_name], "r")

          begin
            Marshal.load(file)
          rescue ArgumentError => e
            Rails.logger.error "Error unmarshalling a field #{attr_name}: #{e}"
            nil
          end
        else
          Rails.logger.error "self[attr_name] is nil"
          nil
        end
      end
    end
  end
end
4

0 回答 0