自动完成操作在每次 ajax 调用时解析一个大的 JSON 文件(使其更快)

Autocomplete action parses a large JSON file at each ajax call (make it faster)

我正在尝试使用 Rails 4 和 Jquery ui 为城市和邮政编码制作自动完成模型。 我有一个很大的 JSON 文件(大约 500,000 行),其中包含一个包含邮政编码 (CP) 和城​​市 (CITY) 的数组 (cp_autocomplete)。

在我当前的模型中,在每个 ajax 查询中,自动完成操作都会读取 JSON 文件,对其进行解析,然后搜索邮政编码或城市,列出九个邮政编码+城市(如果找到)并将列表呈现为 json.

这可行,但渲染列表的时间超过 2 秒。

有什么让它运行得更快的想法吗? - 我怎样才能解析一次 json 文件而不是在每个 ajax 查询中解析? - 我想缓存解析的 json 值,然后在 1 分钟后将其删除。

这是我的自动完成操作:

    def autocomplete
      require 'auto_compeletion_cp_city' #a class that has PostalCode and City attributes
    postal_file = File.read("#{Rails.root}/public/postal_code_fr.json")
    postal_parse = JSON.parse(postal_file)
    @list = []
    if !(ActionController::Base.helpers.sanitize(params[:Postalcode]).blank?)
      search_term = ActionController::Base.helpers.sanitize(params[:Postalcode])
      search = /\A#{search_term}/
          postal_parse["cp_autocomplete"].each do |f|
            if search.match("#{f['CP']}",0) && (@list.length < 9)
              selected = AutoCompletionCpCity.new
              selected.PostalCode = f['CP']
              selected.City = f['CITY']
              @list << selected
            end
          end
    else
      if !(ActionController::Base.helpers.sanitize(params[:city]).blank?)
      search_term = ActionController::Base.helpers.sanitize(params[:city])
      search = /\A#{Regexp.escape(search_term)}/i
      postal_parse["cp_autocomplete"].each do |f|
            if search.match("#{f['CITY']}",0) && (@list.length < 9) 
              selected = AutoCompletionCpCity.new
              selected.PostalCode = f['CP']
              selected.City = f['CITY']
              @list << selected
            end
       end
      end
    end

    respond_to do |format|
      format.json { 
        render json: @list
      }
    end
  end

创建一个小模块来存放邮政编码数据。它可以在进程启动时解析文件一次并永远保留它。由于邮政编码不经常更改(并且此文件在您的存储库中,因此更改它需要部署),因此没有理由只缓存 1 分钟。

module PostalCodes
  DATA = JSON.parse(File.read("#{Rails.root}/public/postal_code_fr.json"))
end

该模块还可以负责搜索您需要的代码和其他行为。

与所有性能优化一样,在深入了解之前,您应该验证导致搜索花费 2 秒的代码部分。如果是 JSON 解析,缓存数据会有所帮助,但如果它是 运行 邮政编码上的正则表达式,则需要不同的解决方案。