1

我正在嘗試使用Rails 4和Jquery ui爲城市和郵編自動填充模型。 我有一個大的JSON文件(約500,000行),其中包含一個包含郵編(CP)和城市(CITY)的數組(cp_autocomplete)。自動完成操作在每個ajax調用中解析大型JSON文件(使其更快)

在我當前的模型中,在每個ajax查詢中,自動完成操作讀取JSON文件,解析它,然後搜索郵政編碼或城市,製作9個郵政編碼+城市列表(如果找到)並將列表呈現爲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 
+0

只是想法你有沒有嘗試數據庫解決方案?或者也許像Redis的東西來替換文件?我經常使用這個解決方案與ajax自動完成選擇字段,並選擇2,但我從來沒有嘗試過500,000行的東西。 –

+0

我正在研究Redis解決方案..我會讓你知道它是否更好。 對於數據庫解決方案,你將數據保存爲json數組還是創建一個新的sql數據庫? 我使用sqlite3進行開發 – Dali

+0

假設你有一個rails應用程序,你已經有一個數據庫了?我會製作一個表格(或者一些表格)來保存這個文本文件中的數據。 –

回答

1

創建一個小模塊,以容納郵政編碼數據。它可以在流程啓動時解析文件一次並永久保存。由於郵政編碼不會經常更改(並且此文件位於您的回購站中,因此更改它需要部署),因此沒有理由僅緩存1分鐘。

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

該模塊還可以負責搜索您需要的代碼和其他行爲。

在深入研究之前,就像所有性能優化一樣,您應該驗證導致搜索需要2秒的代碼部分。如果是JSON解析,緩存數據將會有所幫助,但是如果它運行的是過去郵政編碼的正則表達式,則需要一個不同的解決方案。

+0

你是對的。我可以保留緩存..也許我可以在初始化程序中創建此數據? 任何有關郵政編碼搜索的建議..這不是我所知道的最佳解決方案 – Dali

+0

是的,你當然可以把它放在初始化程序中。對於前綴搜索,[試驗](https://en.wikipedia.org/wiki/Trie)是一個很好的結構。將這些數據存入數據庫也是一個不錯的選擇。 –

+0

通過製作緩存解決方案,ajax請求的響應時間下降到200 ms,軌道執行時間爲66 ms。 http://img15.hostingpics.net/pics/279561RailsView.png 是否值得去嘗試Tries算法? – Dali